首页 > 其他分享 >多线程中的wait与join

多线程中的wait与join

时间:2022-11-02 16:00:25浏览次数:54  
标签:调用 join 线程 obj 多线程 方法 wait

   

 

  wait 一个Object的方法,目的是将调用 obj.wait()的线程置为 waiting 的状态,等待其他线程调用 obj.notify() 或者 obj.notifyAll() 来唤醒。最常见的就算生产者/消费者功能。 有一点注意的就是,wait/notify 方法的调用必须处在该对象的锁(Monitor)中,也即,再调用这些方法时首先需要获取该对象的锁。否则会抛出 IllegalMonitorStateException异常。 wait/notify的通俗解释: 1. 线程 A 首先获取到 obj 的锁,然后执行了 obj.wait(), 这个方法就会是线程 A 暂时让出对 obj 锁的持有,并把线程 A 转换 waiting 状态,同时加入锁对象的等待队列。 2. 线程 B 获取到了 obj 的锁,然后执行了 obj.notify(), 这个方法通知了锁对象的等待队列,使正在等待队列中的线程 A 为阻塞状态,使 A 进入对 obj 锁的竞争。当然在执行 notify 后并不会使线程 A 马上获取锁,因为线程 B目前还持有 obj的锁。 3. 线程 A 获取 obj 的锁,继续从 wait() 之后的代码运行。   join join 方法通常的解释就是等待调用线程执行完毕,再继续执行当前线程。通常用在多线程的业务上,某个线程运算需要另一个线程的结果时,就可以使用 join。 join 的实现

 

可见,线程 A 在调用 obj.join() 方法时,obj 线程如果是 alive 状态(线程开启 start,但未结束),那么就执行 wait 方法。同时看 join(long m) 方法是 synchronized 修饰的,这是我们使用 wait 时需要先获取锁的前置条件。既然知道了 join 的内核是 wait 方法,通过对wait 的了解,线程 A 此时是 waiting 的状态,并进入了 obj 的锁的等待队列去。那么需要看一下什么时候释放了线程 A。 了解一下 Thread.exit() 方法。

 

这个方法由系统调用,当该线程完全退出前给它一个去释放空间。再往下跟到threadTerminated(this) 方法

 

这里有一个 notifyAll() 的方法,可见就是在这里是线程 A 得到了释放继续运行。 到这里就解释通了,join 的确是通过 wait 方法使调用线程变为等待状态,再在被调用线程运行结束时通过系统调用 exit 方法启动了 notifyAll。 我们可以这么理解,把 obj.join 方法替换成 obj.wait() 方法,并且在 obj 线程运行结束后自动执行 notifyAll() 方法,这样就可以用 wait 的思路来理解 join 的运行原理了。   总结: 1. wait 的注意点:wait 方法是 Object 的方法;wait/notify 方法需要获得对象锁后执行。 2. wait 方法会把调用线程转为等待 waiting 状态,释放对象锁,并进入对象锁的等待队列。 3. notify / notifyAll() 方法会唤醒对象锁的等待队列,使其中的线程进入阻塞 blocking 状态抢占对象锁。 4. 调用 notify/notifyAll 后,在 notify/notifyAll 的前获取获得的对象锁得到释放后,等待队列里的线程才有机会抢占锁继续执行。 5. join 方法的内核就是 wait。在被调用对象的线程运行完毕后,系统自动调用被调用对象的 notifyAll 方法。                        

标签:调用,join,线程,obj,多线程,方法,wait
From: https://www.cnblogs.com/qiezi777/p/16851289.html

相关文章

  • mysql——left join on and和left join on where的区别
    参考https://www.cnblogs.com/cgsdg/p/16426658.html 总结:and条件语句不会剔除不满足条件的左表的行。where条件语句会剔除。   ......
  • Java多线程-ThreadLocal(六)
    为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们又接着创造了线程池ThreadPool。就这样就可以了吗?—......
  • java的多线程实现方式以及对应的线程锁实现
    一、多线程的实现1.1继承Thread类继承:packagecom.yuan.yk.ThreadLearn;importstaticcom.yuan.yk.ThreadLearn.func1.doSomething;publicclassThreadFuncextends......
  • Pyhton多线程
    多线程介绍什么是线程​ 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。​ 个线程可以创建和撤消另一个......
  • Java多线程(7):JUC(下)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 除了四种常见的同步器(发令枪、摇号器、栅栏和交换机),JUC还有所谓线程安全的容器、阻塞队列和一些特殊的类。其中常出现的......
  • javascript异步编程之generator(生成器函数)与asnyc/await语法糖
    Generator异步方案相比于传统回调函数的方式处理异步调用,​​Promise​​最大的优势就是可以链式调用解决回调嵌套的问题。但是这样写依然会有大量的回调函数,虽然他们之间......
  • javascript异步编程之generator(生成器函数)与asnyc/await语法糖
    Generator异步方案相比于传统回调函数的方式处理异步调用,Promise最大的优势就是可以链式调用解决回调嵌套的问题。但是这样写依然会有大量的回调函数,虽然他们之间没有嵌......
  • 多线程 & 反射 & 注解 & JDBC 核心点总结
    多线程核心点:线程安全创建线程的两种方式线程生命周期获取、修改线程名获取当前线程对象静态方法sleep()通过异常终止线程的睡眠interrupt()强行终止线程合理......
  • Linux--多线程(三)
    生产者消费者模型概念:生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过一个来进行通讯,所以生产者生产完数......
  • Java多线程(7):JUC(上)
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了。......