wait notify

几个注意点:

wait 与 notify/notifyAll 方法必须在同步代码块中使用,即要先对调用对象加锁。

当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁。

从这里可以看出,notify/notifyAll()执行后,并不立即释放锁,而是要等到执行完临界区中代码后,再释放。故,在实际编程中,我们应该尽量在线程调用notify/notifyAll()后,立即退出临界区。即不要在notify/notifyAll()后面再写一些耗时的代码

示例代码:

public class Service {public void testMethod(Object lock) {try {synchronized (lock) {System.out.println("begin wait() ThreadName="+ Thread.currentThread().getName());lock.wait();System.out.println("  end wait() ThreadName="+ Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}public void synNotifyMethod(Object lock) {try {synchronized (lock) {System.out.println("begin notify() ThreadName="+ Thread.currentThread().getName() + " time="+ System.currentTimeMillis());lock.notify();Thread.sleep(5000);System.out.println("  end notify() ThreadName="+ Thread.currentThread().getName() + " time="+ System.currentTimeMillis());}} catch (InterruptedException e) {e.printStackTrace();}}
}

  

在第3行的testMethod()中调用 wait(),在第17行的synNotifyMethod()中调用notify()

从上面的代码可以看出,wait() 与  notify/notifyAll()都是放在同步代码块中才能够执行的。如果在执行wait() 与  notify/notifyAll() 之前没有获得相应的对象锁,就会抛出:java.lang.IllegalMonitorStateException异常。

在第8行,当ThreadA线程执行lock.wait();这条语句时,释放获得的对象锁lock,并放弃CPU,进入等待队列。

当另一个线程执行第23行lock.notify();,会唤醒ThreadA,但是此时它并不立即释放锁,接下来它睡眠了5秒钟(sleep()是不释放锁的,事实上sleep()也可以不在同步代码块中调用),直到第28行,退出synchronized修饰的临界区时,才会把锁释放。这时,ThreadA就有机会获得另一个线程释放的锁,并从等待的地方起(第24行)起开始执行。

notify 通知的顺序不能错

假设在线程A中执行wait(),在线程B中执行notify()。但如果线程B先执行了notify()然后结束了,线程A才去执行wait(),那此时,线程A将无法被正常唤醒了(还可以通过interrupt()方法以抛出异常的方式唤醒^~^)。

join

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

如果一个线程A执行了thread.join()语句,含义是:当前线程A等待thread线程终止之后也从thread.join()返回

thread.join还可以指定超时时间

java多线程wait notify join相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. Java多线程神器:join使用及原理

    转载自 Java多线程神器:join使用及原理 join() join()是线程类 Thread的方法,官方的说明是: Waits for this thread to die. 等待这个线程结束,也 ...

  3. JAVA多线程基础篇-join方法的使用

    1.概述 join()是Thread类中的一个方法,它的作用是将当前线程挂起,等待其他线程结束后再执行当前线程,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行.通常用于在main主 ...

  4. 【Java】Java多线程神器:join使用及原理

    1.概述 转载:http://www.javastack.cn/article/2017/java-thread-join/ join() join()是线程类Thread的方法,官方的说明是: Wa ...

  5. java 多线程 一个博客

    http://blog.csdn.net/a352193394/article/category/2563875 Java多线程之~~~线程安全容器的非阻塞容器 在并发编程中,会经常遇到使用容器.但是 ...

  6. Java多线程:synchronized | Volatile 和Lock和ReadWriteLock多方位剖析(一)

    前言 本文站在多线程初中级学习者的角度,较为全面系统的带你一起了解多线程与锁相关的知识点.带你一起解开与锁相关的各种概念.用法.利弊等.比如:synchronized.Volatile.Lock.Re ...

  7. JAVA多线程:守护线程 setDaemon全方位剖析| 守护线程是线程吗 |thread.isAlive()反思(五)

    前言 本文目的,通过短小精悍的实例,让你在最短时间,全面揭晓 thread.setDaemon(true)守护线程的使用,及其使用场景.一看就懂,一学就会! 概述 守护线程的作用 用来让其(这里暂称之 ...

  8. JAVA多线程:sleep(0)、sleep(1)、sleep(1000)的区别(四)

    前言 讨论这个问题前,需要先了解以下知识点! 1.等待/阻塞队列(blocked)中的线程不参与cpu竞争,就绪队列(runable)中的线程才会参与cpu竞争. 2.CPU竞争策略有多种,Unix使 ...

  9. java 多线程并行_Fork and Join: Java Can Excel at Painless Parallel Programming Too! | Oracle 中国...

    Java SE 7 提供的新分解/合并任务如何使编写并行程序变得更轻松? 下载: 多核处理器现在已广泛应用于服务器.台式机和便携机硬件.它们还扩展到到更小的设备,如智能电话和平板电脑.由于进程的线程可 ...

最新文章

  1. BZOJ-1257-[CQOI2007]余数之和sum
  2. 漫谈linux文件IO
  3. UNIX再学习 -- 再识
  4. php中new意思,php 在一个类中new自己代表什么意思 ?是构造函数
  5. java decompiler_Java Decompiler(Java反编译工具)
  6. 操作系统(3) -- 内存管理
  7. 云图说|初识云数据库GaussDB(for Cassandra)
  8. 自定义css样式结合js控制audio做音乐播放器
  9. java排序学习笔记
  10. 02-07 Python库-pytest
  11. mysql中外键总结_mysql外键的一些总结
  12. 前牙正常覆盖是多少_深覆合和深覆盖两者怎么区分?花两分钟进来了解一下
  13. oracle数据库第十一章答案,[转载]《互联网数据库》网上作业练习题10-11章答案...
  14. OD使用教程23 - 调试篇23
  15. leapftp中文版,leapftp中文版的5大主要功能
  16. 从多个文件创建数据透视表或Excel表
  17. 用JavaScript检测IE浏览器版本
  18. 兼容 IE、 FireFox 的 javascript 日历控件 原创作者:寒羽枫(cityhunter172)
  19. CSP—— 登机牌条码(多项式的求解以及多项式的除法)
  20. 工作总结以及学习总结和整理的链接

热门文章

  1. ITK:二进制或两张图片
  2. DCMTK:将DICOM文件的内容转换为JSON格式
  3. VTK:可视化之DistanceToCamera
  4. OpenCV calcOpticalFlowPyrLK用法的实例(附完整代码)
  5. OpenCV textDetectionModel和textRecognitionModel API的端到端的实例(附完整代码)
  6. Qt Designer的Tab顺序编辑模式
  7. Qt Creator编辑2D内容
  8. Qt Creator指定运行设置
  9. QT的QSignalBlocker类的使用
  10. c++STL容器的Vector