本文主要是介绍Java并发(二十四)----wait、notify、notifyAll、join区别与联系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、join
是调用者轮询检查线程 alive 状态,执行后线程进入阻塞状态。
如在线程B中调用线程A的join(),那线程B会进入到阻塞队列,直到join结束或中断线程B才开始进入阻塞队列。可以实现一个线程的顺序执行。
t1.join();
等价于下面的代码
synchronized (t1) {// 调用者线程进入 t1 的 waitSet 等待, 直到 t1 运行结束while (t1.isAlive()) {t1.wait(0);}
}
注意
join 体现的是【保护性暂停】模式,请参考Java并发(二十二)----同步模式之保护性暂停 中第四小节:带超时版 GuardedObject
2、wait()和notify()、notifyAll()
1、wait方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用
2、wait()方法使当前线程暂停执行并释放会cpu资源,以及同步锁(类锁和对象锁)
3、调用wait()后必须调用notify()或notifyAll()后线程才会从等待池进入到锁池,当我们的线程竞争得到同步锁后就会重新进入绪状态等待cpu资源分配
当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。
注意:
1、这三个方法都是java.lang.Object的方法。
2、notif()方法要配合wait()方法使用,一般在wait()之后调用或者在线程结束时调用才会成功。
这篇关于Java并发(二十四)----wait、notify、notifyAll、join区别与联系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!