本文将通过三个程序例子帮助读者理解其中的原理:

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class WaitNotify {static boolean flag = true;static Object lock = new Object();public static void main(String[] args) throws Exception {Thread waitThread = new Thread(new Wait(), "WaitThread");waitThread.interrupt();System.out.println(waitThread.isInterrupted());waitThread.start();waitThread.interrupt();System.out.println(waitThread.isInterrupted());TimeUnit.SECONDS.sleep(1);}static class Wait implements Runnable {public void run() {// 加锁,拥有lock的Monitorsynchronized (lock){try{System.out.println(Thread.currentThread() + " flag is true. wait @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));lock.wait();}catch (InterruptedException e){System.out.println("中断");}System.out.println(Thread.currentThread() + " flag is false. running @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));}}}

从结果可以看出,在wait方法之前发生中断操作,将中断标志位置为true则wait方法首先将中断标志位置为false然后抛出异常,执行后续操作。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class WaitNotify {static boolean flag = true;static Object lock = new Object();public static void main(String[] args) throws Exception {Thread waitThread = new Thread(new Wait(), "WaitThread");// waitThread.setPriority(10);waitThread.interrupt();System.out.println(waitThread.isInterrupted());waitThread.start();waitThread.interrupt();System.out.println(waitThread.isInterrupted());TimeUnit.SECONDS.sleep(1);//Thread notifyThread = new Thread(new Notify(), "NotifyThread");//notifyThread.start();}static class Wait implements Runnable {public void run() {// 加锁,拥有lock的Monitorsynchronized (lock) {// 当条件不满足时,继续wait,同时释放了lock的锁while (flag) {try {System.out.println(Thread.currentThread() + " flag is true. wait @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));lock.wait();} catch (InterruptedException e) {System.out.println("中断");}}// 条件满足时,完成工作System.out.println(Thread.currentThread() + " flag is false. running @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));}}}

可将这个程序与上面进行比较,由于执行wait方法将中断标志位置为false,所以在下一个循环中wait方法将不会抛出异常,继续执行后续操作。

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class WaitNotify {static boolean flag = true;static Object lock = new Object();public static void main(String[] args) throws Exception {Thread waitThread = new Thread(new Wait(), "WaitThread");waitThread.start();TimeUnit.SECONDS.sleep(1);Thread notifyThread = new Thread(new Notify(), "NotifyThread");notifyThread.start();}static class Wait implements Runnable {public void run() {// 加锁,拥有lock的Monitorsynchronized (lock) {// 当条件不满足时,继续wait,同时释放了lock的锁while (flag) {try {System.out.println(Thread.currentThread() + " flag is true. wait @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));lock.wait();} catch (InterruptedException e) {System.out.println("中断");}}// 条件满足时,完成工作System.out.println(Thread.currentThread() + " flag is false. running @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));}}}static class Notify implements Runnable {public void run(){// 加锁,拥有lock的Monitorsynchronized (lock) {// 获取lock的锁,然后进行通知,通知时不会释放lock的锁,// 直到当前线程释放了lock后,WaitThread才能从wait方法中返回System.out.println(Thread.currentThread() + " hold lock. notify @ " + new SimpleDateFormat("HH:mm:ss").format(new Date()));lock.notifyAll();flag = false;SleepUtils.second(5);}// 再次加锁synchronized (lock) {System.out.println(Thread.currentThread() + " hold lock again. sleep @ "+ new SimpleDateFormat("HH:mm:ss").format(new Date()));SleepUtils.second(5);}}}


可将这个程序与上面的两个进行对比比较,则会发现notify和interupt方法对于wait方法不同的效果。

理解notify()/notifyall()/interupt()对于线程里面wait方法的影响相关推荐

  1. sleep()、yield()、join()、wait()/notify()、interupt()——多线程中常用的方法

    一.sleep()--线程休眠 线程休眠:指的是让线程暂缓执行一下,等到了预计时间之后再恢复执行. 线程休眠会交出CPU,让CPU去执行其他的任务.sleep() 方法不会释放锁,也就是说如果当前线程 ...

  2. JAVA线程间协作:wait.notify.notifyAll

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. java并发编程(十)使用wait/notify/notifyAll实现线程间通信

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait()  thr ...

  4. 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )

    1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...

  5. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()

    1. wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前 ...

  6. java notify 指定_java的notify/notifyAll:如何notify指定的线程?

    我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait.noitify.notifyAll做并发控制. 当生产者生产完毕后,如何只notify消费者呢? 你确保只有消费者 ...

  7. java线程同步(synchronized,wait,notify,notifyAll)

    synchronized: 包括synchronized方法和synchronized块. synchronized方法使用this作为默认的"同步监视器",而synchroniz ...

  8. java线程的生命周期及wait(),notify(),notifyAll()的详解分析

    1.java线程的生命周期     线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread)     当创建Thread类的一个实例(对象)时, ...

  9. 线程方法notify/notifyAll源码分析

    众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢? 本章内容要解决的问题 问题1:notify/nofityAll真的唤醒了线程吗? 问题2: ...

最新文章

  1. TensorFlow1.8.0正式发布,Bug修复和改进内容都在这里了
  2. 遗留应用现代化场景:如何正确使用RESTful API
  3. Python进阶02 文本文件读写
  4. ecmall数据库表详解 二次开发必备
  5. Winform中通过代码设置DevExpress的TextEdit的类型为Numbernic
  6. Dubbo支持的协议
  7. C# == 和equals()区别
  8. Linux_arm_启动_c语言部分详解,[原创]Linux arm 启动 c语言部分详解第四讲
  9. 2018-2019-2 网络对抗技术 20165329 Exp 8 Web基础
  10. Redis基础1(定义及基础)
  11. networkx 中心势计算_科学网—复杂网络分析库NetworkX学习笔记(2):统计指标计算 - 闫小勇的博文...
  12. 计算机软件3dmax在展览中的研究,【建模技巧】实用展览设计3ds Max建模方法(第一期)...
  13. 【毕业答辩】怎样做好毕业答辩?纯干货
  14. BXP多分区的正确的操作步骤(转)
  15. win10-11电脑配置3080Ti 配置驱动NVIDIA CUDA驱动11.4和10.2版本-安装步骤和下载vs2019+双NVIDIA配置教程
  16. win7怎么看计算机信息,如何查看Win7版本信息
  17. 怎么做说课PPT课件?
  18. Vue中在线引用iconfont图标
  19. php自动计算增长率,Oracle表空间增长率监控脚本
  20. 云服务器系列2-frp-云服务器内网穿透windows远程控制实践

热门文章

  1. k8s安装elasticsearch集群
  2. 大数据面试知识点总结
  3. Anaconda(Miniconda)环境配置
  4. Java后端实现弹框
  5. 360手机开启Log打印
  6. iOS如何实时查看App运行日志
  7. C语言的编译,汇编和链接
  8. 计算机硬件技术基础(太原理工大学):第五章
  9. 抖音小说推荐号内容制作流程,应当如何掌握节奏?需要注意哪些问题
  10. 一、初识 Spring 框架