精华内容
下载资源
问答
  • 线程等待 为什么需要线程等待(WHY)? 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。 创建新的线程不会复⽤刚才退出线程的地址空间 如何等待(HOW)? 功能:等待线程结束 原型 #include &...

    线程等待

    • 为什么需要线程等待(WHY)?

      1. 已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。

      2. 创建新的线程不会复⽤刚才退出线程的地址空间

    • 如何等待(HOW)?

      功能:等待线程结束 原型
      
      #include <pthread.h>
      
      int pthread_join(pthread_t thread, void **value_ptr);
      
      参数 thread:线程ID
      value_ptr:它指向⼀一个指针,后者指向线程的返回值 
      返回值:成功返回0;失败返回错误码
      
      调用该函数的线程将挂起等待,直到id为thread的线程终止
      
      thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的:
      1. 如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数
      的返回值
      
      2. 如果thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元
      里存放的是常数PTHREAD_CANCELED(pthread库中常数PTHREAD_CANCELED的值是-1#define PTHREAD_CANCELED ((void *)-1)
      
      
      3. 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传
      给pthread_exit的参数
      
      注意:如果对thread线程的终止状态不关心,可以传NULL给value_ptr参数
      
    展开全文
  • Object中的wait()、notify()让线程等待和唤醒 Object.wait()、Object.notify()方法必须再synchronized修饰的代码块中才能正常使用,否则会报异常(语法不会显示有错误) 如下如果注释synchronized (obj)会报java.lang....

    Object中的wait()notify()让线程等待和唤醒

    Object.wait()Object.notify()方法必须再synchronized修饰的代码块中才能正常使用,否则会报异常(语法不会显示有错误)

    如下如果注释synchronized (obj)会报java.lang.IllegalMonitorStateException: current thread is not owner

    正常使用必须在synchronized中使用!
    public static void main(String[] args) {
        Object obj = new Object();
        new Thread(() -> {
           // synchronized (obj) {
                System.out.println(Thread.currentThread().getName() + "\t======== 进入");
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "\t======== 被唤醒");
           // }
        }, "A").start();
    
        new Thread(() -> {
            //synchronized (obj) {
                obj.notify();
                System.out.println(Thread.currentThread().getName()+"\t============ 通知");
            //}
        }, "B").start();
    }
    

    Condition中的await()signal()让线程等待和唤醒

    Condition需要在ReentrantLock下使用,也就是需要上锁和释放锁,否则也会报java.lang.IllegalMonitorStateException

    public static void main(String[] args) {
        ReentrantLock lock = new ReentrantLock();
        Condition condition=lock.newCondition();
    
        new Thread(() -> {
    //            lock.lock();
                System.out.println(Thread.currentThread().getName() + "\t======== 进入");
                try {
                    condition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
    //                    lock.unlock();
                }
                System.out.println(Thread.currentThread().getName() + "\t======== 被唤醒");
        }, "A").start();
    
        new Thread(() -> {
    //            lock.lock();
            try {
                condition.signal();
                System.out.println(Thread.currentThread().getName()+"\t============ 通知");
            } finally {
    //                lock.unlock();
            }
        }, "B").start();
    }
    

    LockSupport中的park()unpark()

    LockSupport调用unpark方法最多只发放一个许可证,调用park则需要消耗一个许可证。
    换而言之

    如下的逻辑虽然调用了两次unpark,但LockSupport只发放一个许可证

    LockSupport.unpark(t1)//需要传入参数线程t1
    LockSupport.unpark(t1)//需要传入参数线程t1
    LockSupport.park()
    LockSupport.park()// 线程会阻塞
    

    另外LockSupport.park()和LockSupport.unpark()不影响正常使用阻塞

    LockSupport.unpark(t1)//需要传入参数线程t1
    LockSupport.park()
    // 上面的顺序和下面的调用顺序,两者的作用相同
    LockSupport.park()
    LockSupport.unpark(t1)//需要传入参数线程t1
    

    总而概之,LockSupport是一个线程阻塞的工具类,里面的所有方法都是静态的

    相关文章:

    1、LockSupport源码的简化

    2、LockSupport中文文档

    展开全文
  • API-线程等待CPU优化 用到的API 1、MsgWaitForMultipleObjects 2、WaitForSingleObject 3、SetThreadAffinityMask 4、SetThreadIdealProcessor 511遇见易语言多线程大漠多线程 模块源码 .子程序 线程_等待, ...

    API-线程等待CPU优化

    用到的API

    1、MsgWaitForMultipleObjects
    2、WaitForSingleObject
    3、SetThreadAffinityMask
    4、SetThreadIdealProcessor

    511遇见易语言多线程大漠多线程

    模块源码

    .子程序 线程_等待, 逻辑型, 公开, 等待一个线程,返回真表示线程运行结束,返回假表示已超时
    .参数 线程句柄, 整数型
    .参数 等待时间, 整数型, 可空, 单位毫秒,默认为5秒,无限等待--4294967295
    .局部变量 ret, 整数型
    .局部变量 时间, 整数型
    
    .如果真 (等待时间 = 0)
    等待时间 = -1
    .如果真结束
    时间 = 取启动时间 ()
    .循环判断首 ()
    ret = MsgWaitForMultipleObjects (1, 线程句柄, 假, 等待时间, 1215)
    .如果真 (等待时间 ≠ -1)
    .如果真 (取启动时间 () - 时间 ≥ 等待时间)
    ret = 258
    .如果真结束
    
    .如果真结束
    处理事件 ()
    .循环判断尾 (ret ≠ 0 且 ret ≠ 258)
    返回 (ret = 0)

     

    展开全文
  • 如:获取线程的ID、线程等待线程等待的几种方法如下: this_thread::sleep_for(chrono::seconds(3)); //线程等待 3 秒 this_thread::yield(); //让CPU先执行其他线程,空闲时再执行些线程 this_thread::sleep_...

    本代码主要是使用LAMBDA表达式与线程的一起使用,还有线程的几个方法的测试:

    如:获取线程的ID、线程等待,线程等待的几种方法如下:

    this_thread::sleep_for(chrono::seconds(3));//线程等待 3 秒
    this_thread::yield();//让CPU先执行其他线程,空闲时再执行些线程
    this_thread::sleep_until();//到某个时刻到来之前一直等待,定时等待。

    测试代码如下:

    /*
    C++中创建多线程,建议使用LAMBDA表达式
    下面几个参数在 迅雷 的定时下载中都有体现 如空间下载、定时下载.......
    this_thread::sleep_for()	//等待多少秒后执行。
    this_thread::yield();		//CPU空闭了才执行行
    this_thread::sleep_unitl();	//等到某个时间点时才执行
    this_thread::get_id()	//获取线程ID
    */
    #include<iostream>
    #include<thread>
    #include<chrono>
    #include<Windows.h>
    
    using namespace std;
    
    //线程等待与获取线程 ID
    void main4C()
    {
    	thread th1([](){
    		
    		this_thread::sleep_for(chrono::seconds(3));	//线程等待 3 秒
    		//this_thread::yield();	//让CPU先执行其他线程,空闲时再执行些线程
    		//this_thread::sleep_until();	//到某个时刻到来之前一直等待,定时等待。
    		cout << this_thread::get_id() << endl;		//获取线程的 ID
    	});
    
    	thread th2([](){
    		this_thread::sleep_for(chrono::seconds(10));	//线程等待 10 秒
    		cout << this_thread::get_id() << endl;
    	});
    
    	th1.join();
    	th2.join();
    
    	cin.get();
    }
    
    void main4b()
    {	
    	thread th1([](){MessageBoxA(0, "1", "2", 0); });
    	thread th2([](){MessageBoxA(0, "1", "2", 0); });
    	th1.join();
    	th2.join();
    
    	cin.get();
    }
    
    void main4a()
    {
    	auto fun = [](){MessageBoxA(0, "1", "2", 0); };
    	thread th1(fun);
    	thread th2(fun);
    	th1.join();
    	th2.join();
    
    	cin.get();
    }


    展开全文
  • C#:线程(4):线程等待

    千次阅读 2018-07-24 08:06:59
    线程等待,或者说叫等待线程。其语句是 线程名.Join() 。按照我的理解,这个语句其实是告诉系统程序,这个线程很重要,你必须使用全部的计算资源供他计算,等他计算结束了之后再回到这个位置。     举例来说,...
  • linux下的C语言开发(线程等待)

    千次阅读 2016-07-06 21:48:20
    线程等待
  • 线程等待和线程守护 线程等待: 使用的是join方法,其功能是指等待某个线程执行完成后主线程才会继续执行 线程守护: 使用的是setDaemon方法,其功能是指当主线程执行结束,不管调用该方法的进程有没有结束,...
  • Java线程等待唤醒机制(加深理解)

    万次阅读 多人点赞 2019-08-04 16:28:06
    这里就用到了线程等待唤醒机制,下面具体看一下。 等待唤醒机制示例 下面代码是一个简单的线程唤醒机制示例,主要就是在Activity启动的时候初始化并start线程,线程start后会进入等待状态,在onResume方法中执行...
  • MFC线程等待不是使用sleep

    千次阅读 2019-08-08 08:45:59
    因为MFC线程里面的sleep时候,是整体程序都停止下来,所以需要一个只是让当前的线程等待,其他的地方都是正常运行 1、创建全局变量 HANDLE g_event = CreateEvent(NULL,TRUE,FALSE,NULL); 2、线程里面最后写上...
  • 线程等待时间过长的处理

    千次阅读 2019-10-28 18:14:14
    多线程协作,线程等待的场景时常有,实际使用中需要避免线程无休止的等待,避免用户等待时间过长。 简单的一个案例: if (!transTimeQueryFuture.isDone()) { log.info("等待产品实际数据日期查询线程执行结束...
  • 线程等待 Join()方法

    千次阅读 2019-03-27 21:10:45
    Join()方法是让一个线程等待另一个线程的完成 下面看个例子: package project11;public class TestJoin extends Thread { public void run() { for(int i= 1;i;i++)//线程循环10次输出 { System.out....
  • 多线程中的线程等待执行

    千次阅读 2010-02-27 09:51:00
    多线程中的线程等待执行 邵盛松 2010-2-27 一、一个线程的等待等待一个线程A执行完毕之后,执行线程B同步对象为事件对象使用CEvent类CEvent eventA;//全局变量CWinThread *pA=AfxBeginThread(函数A); pA->...
  • 下面我用代码使用Thread类实现线程等待,回调,前台线程/后台线程 首先我们需要先定义一个比较消耗资源的方法用来跑线程 /// <summary> /// 一个比较耗时耗资源的私有方法 /// </summary> /// <param...
  • java多线程等待,唤醒,以及线程同步。  在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和...
  • 线程等待wait()和通知notify(),主要用于多线程之间的协作,而且这两个方法都是属于Object类,说明任何对象都可以调用这两个方法。 当在一个对象实例上调用wait()方法后,当前线程就会在这个对象上等待。直到另外的...
  • 用JAVA实现线程等待提示框

    千次阅读 2016-07-14 10:09:58
    用JAVA实现线程等待提示框 Java语言从其诞生到现在不过短短五年时间,却已经成为全球最热门的语言,Java程序员正成为IT业其它程序员中薪金最高的职员。这一切都应归功于Java良好的特性:简单、面向对象、分布式、...
  • 1. 什么是线程   线程是进程执行内部的一个执行分支,在一个进程内部运行的多种执行流;内部本质上是多个线程在同一个地址空间运行;第一个pcb称之为主线程;有多个线程就有多个执行流;一个进程至少有一个线程 ...
  • java 中wait和notify 线程等待和线程唤醒的使用方式 需要借助synchronized
  • 当一个线程等待另一个线程完成任务时,有几种选择。 第一种,线程持续性的检查共享数据标志。但是这样会造成性能的浪费,而且重复性的访问势必会对数据进行长时间的上锁,从而造成其他线程无法访问,这样线程就会...
  • 线程等待与唤醒

    千次阅读 2018-08-15 17:42:12
    wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()...
  • java 线程等待与唤醒

    千次阅读 2014-08-09 17:31:02
    本章,会对线程等待/唤醒方法进行介绍。涉及到的内容包括: 1. wait(), notify(), notifyAll()等方法介绍 2. wait()和notify() 3. wait(long timeout)和notify() 4. wait() 和 notifyAll() 5. 为什么notify(), wait...
  • 线程等待通知机制

    千次阅读 2018-07-23 09:06:01
    等待通知机制,是指一个线程A调用了对象O的wait方法进入等待状态,而另一个线程调用了对象O的notify或者notifyAll方法,线程A收到通知后从对象O的wait方法返回,进而执行后续操作 方法名称 描述 notify() ...
  • C++大量线程等待与唤醒

    千次阅读 2020-06-20 18:01:36
    线程等待和唤醒使用条件变量condition_variable和锁mutex结合实现,其中条件变量提供了wait(), notify(), notifyAll()等方法。 wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的...
  • 线程等待: 函数:pthread_join extern int pthread_join __P (pthread_t __th, void **__thread_return); 参数: 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的...
  • java 多线程—— 线程等待与唤醒

    千次阅读 2017-02-21 13:43:29
    第1部分 wait(), notify(), ...wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而no
  • Java——设置线程等待与线程唤醒

    千次阅读 2017-10-10 14:49:24
    //线程间的通信:线程的任务...指明让持有哪个锁的线程等待或被唤醒 */ //还是上次的例子,实现存一个输出一个,而不是输出一大堆//描述数据 class Res{ String name; String sex; //加一个flag标记,false表示没
  • 异步多线程,不会占用UI线程,方法由子线程完成 2、同步方法慢,只有主线程在执行方法;异步方法快,启动了多个线程同时执行方法,当然这样会占用更多的资源(多线程的调度管理,也需要消耗资源
  • 等待线程常常需要做的事情。当你读取用户的输入,或是存取磁盘文件时,你的线程必须等待因为磁盘存取速度和用户输入动作的速度是CPU速度的百万(甚至)分之一。等待线程的一种必要之恶。  等待技术:  1.Win32...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,634
精华内容 26,253
关键字:

线程等待