理解notify()/notifyall()/interupt()对于线程里面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.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方法的影响相关推荐
- sleep()、yield()、join()、wait()/notify()、interupt()——多线程中常用的方法
一.sleep()--线程休眠 线程休眠:指的是让线程暂缓执行一下,等到了预计时间之后再恢复执行. 线程休眠会交出CPU,让CPU去执行其他的任务.sleep() 方法不会释放锁,也就是说如果当前线程 ...
- JAVA线程间协作:wait.notify.notifyAll
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- java并发编程(十)使用wait/notify/notifyAll实现线程间通信
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait() thr ...
- 线程的状态转换、sleep()、wait()、yeild()、终止线程的方法、线程之间的协作(join()、wait() notify() notifyAll()、await() signal() )
1.线程的状态转换 1.1 新建(New) 创建后尚未启动 1.2 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片. 包含了操作系统线程状态中的 Running 和 Read ...
- java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()
1. wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前 ...
- java notify 指定_java的notify/notifyAll:如何notify指定的线程?
我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait.noitify.notifyAll做并发控制. 当生产者生产完毕后,如何只notify消费者呢? 你确保只有消费者 ...
- java线程同步(synchronized,wait,notify,notifyAll)
synchronized: 包括synchronized方法和synchronized块. synchronized方法使用this作为默认的"同步监视器",而synchroniz ...
- java线程的生命周期及wait(),notify(),notifyAll()的详解分析
1.java线程的生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. (1)生命周期的五种状态 新建(new Thread) 当创建Thread类的一个实例(对象)时, ...
- 线程方法notify/notifyAll源码分析
众所周知,使用notify/notifyAll方法能唤醒wait等待的线程,那么在底层源码究竟做了些什么呢? 本章内容要解决的问题 问题1:notify/nofityAll真的唤醒了线程吗? 问题2: ...
最新文章
- TensorFlow1.8.0正式发布,Bug修复和改进内容都在这里了
- 遗留应用现代化场景:如何正确使用RESTful API
- Python进阶02 文本文件读写
- ecmall数据库表详解 二次开发必备
- Winform中通过代码设置DevExpress的TextEdit的类型为Numbernic
- Dubbo支持的协议
- C# == 和equals()区别
- Linux_arm_启动_c语言部分详解,[原创]Linux arm 启动 c语言部分详解第四讲
- 2018-2019-2 网络对抗技术 20165329 Exp 8 Web基础
- Redis基础1(定义及基础)
- networkx 中心势计算_科学网—复杂网络分析库NetworkX学习笔记(2):统计指标计算 - 闫小勇的博文...
- 计算机软件3dmax在展览中的研究,【建模技巧】实用展览设计3ds Max建模方法(第一期)...
- 【毕业答辩】怎样做好毕业答辩?纯干货
- BXP多分区的正确的操作步骤(转)
- win10-11电脑配置3080Ti 配置驱动NVIDIA CUDA驱动11.4和10.2版本-安装步骤和下载vs2019+双NVIDIA配置教程
- win7怎么看计算机信息,如何查看Win7版本信息
- 怎么做说课PPT课件?
- Vue中在线引用iconfont图标
- php自动计算增长率,Oracle表空间增长率监控脚本
- 云服务器系列2-frp-云服务器内网穿透windows远程控制实践