Thinking in java 第21章 并发 wait() 与 notifyAll()
wait 使你可以等待某个条件发生变化,而改变这个条件超出了当前方法的控制能力,通常,这种条件将由另一个任务来改变。你肯定不想在你的任务测试这个条件的同时,不断的进行空循环,这被称为忙等待,通常是一种不良的cpu周期使用方式。因此wait等待会在等待时将任务挂起,并且只有在notify或者notifyAll的时候才会会被唤醒并检查所发生的变化,因此,wait提供了一种在任务之间同步的方法。
调用sleep方法的时候,锁并没有被释放,调用yied()也时一样。而wait将释放掉这个锁。这一点很重要,其他需要这个锁的 互斥区可以被访问。
wait()与notify()属于Object,看起来有些奇怪,不过这是由道理的,因为这些方法操作的锁也时这个对象的一部分,所以,你可以把wait方法放进任何同步方法中,实际上,也只能在同步方法中调用wait,因为要操作锁,当你在非同步中使用wait()的时候,程序能够通过编译,但是在运行的时候经常出错。
让我们看一个简单的示例(我觉得不简单),car 代表一辆车,需要对它涂蜡 和 抛光,但是这两个程序是由步骤的,肯定是先涂蜡,在抛光,然后在涂蜡,这样子,不能没腊也抛光,有腊还继续涂蜡,下面是示例:
class Car{//是否有腊private boolean waxOn = false;//打蜡,有腊,其他任务可以继续public synchronized void waxed(){waxOn = true;//唤醒所有线程,检查状态,该干什么notifyAll();}//抛光,没有腊,其他任务可以继续public synchronized void buffed(){waxOn = false;//唤醒所有线程,检查状态,该干什么notifyAll();}/***如果没有腊,此线程挂起** @throws InterruptedException*/public synchronized void waitForWaxing() throws InterruptedException{while(waxOn == false)wait();}/**** 有腊挂起** @throws InterruptedException*/public synchronized void waitForBuffing() throws InterruptedException{while(waxOn == true)wait();}
}class WaxOn implements Runnable {private Car car;public WaxOn(Car c){car = c;}@Overridepublic void run() {try {while(!Thread.interrupted()) {//睡眠,更快退出线程TimeUnit.MILLISECONDS.sleep(200);//打蜡说明System.out.println("Wax On!");//打蜡car.waxed();//根据状态挂起此线程,释放锁,等待唤醒car.waitForBuffing();}} catch (InterruptedException e) {System.out.println("Exiting via interrupt");}System.out.println("Ending Wax On task");}
}class WaxOff implements Runnable {private Car car;public WaxOff(Car c){car = c;}@Overridepublic void run() {try {while(!Thread.interrupted()) {//如果没有腊,此线程挂起,释放锁,直到被唤醒car.waitForWaxing();//被唤醒,并且打上了腊//抛光System.out.println("Wax Off");//睡眠,更快退出线程TimeUnit.MILLISECONDS.sleep(200);//汽车状态切换car.buffed();}} catch (InterruptedException e) {System.out.println("Exiting via interrupt");}System.out.println("Ending Wax Off task");}
}public class WaxOMatic {public static void main(String[] args) throws Exception{Car car = new Car();ExecutorService exec = Executors.newCachedThreadPool();exec.execute(new WaxOff(car));exec.execute(new WaxOn(car));TimeUnit.SECONDS.sleep(5);exec.shutdownNow();}
}Wax On!
Wax Off
Wax On!
Wax Off
Wax On!
Wax Off
Exiting via interrupt
Exiting via interrupt
Ending Wax Off task
Ending Wax On task
结果只展示了最重要的一部分,在本例中,有两条线程,一条打蜡,一条抛光,因为是先打蜡,所以,可以等打完腊,等待状态改变被唤醒,而打完腊的时候,就会通知所有线程检查状态,做点对应的什么事情,在检查状态是否将本线程挂起,释放锁,
抛光其实也一样,只是抛光是在后面,所以必须要先检查状态,在决定是否抛光,这样,就能够控制到同步的效果
Thinking in java 第21章 并发 wait() 与 notifyAll()相关推荐
- Java编程思想读书笔记--第21章并发
1.基本的线程机制 定义任务 public class LiftOff implements Runnable{protected int countDown = 10;private static ...
- 《JAVA编程思想》学习笔记:第21章(并发)
目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...
- 《Kotlin从小白到大牛》第21章:Kotlin与Java混合编程
第21章 Kotlin与Java混合编程 Kotlin毕竟还是一种新的语言,所以很多项目.组件和框架还是用Java开发的,目前Kotlin不能完全取代Java,因此有时会使用Kotlin调用Java写 ...
- 第二十四章 并发编程
第二十四章 并发编程 爱丽丝:"但是我不想进入疯狂的人群中" 猫咪:"oh,你无能为力,我们都疯了,我疯了,你也疯了" 爱丽丝:"你怎么知道我疯了&q ...
- CoreJava 笔记总结-第十二章 并发-2
文章目录 第十二章 并发 `synchronized`关键字 同步块 监视器概念 `volatile`字段 `final`变量 原子性 死锁 线程安全的集合 阻塞队列 映射条目的原子更新 对并发散列映 ...
- CoreJava 笔记总结-第十二章 并发-1
第十二章 并发 线程 package chapter12_concurrent.threads;public class ThreadsTest {public static final int DE ...
- java ee api_Java EE并发API教程
java ee api 这是一个示例章节,摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 . 本章讨论了新的Java EE并发API(JSR 236) , ...
- java jsr_分叉并加入Java 7 – JSR 166并发实用程序
java jsr Java 7最有趣的改进之一是对并发的更好支持. 借助JSR 166并发实用程序,我们获得了一些非常有用的并发改进. 在我看来,fork-join库在软件工程中具有很高的实际应用潜力 ...
- 分叉并加入Java 7 – JSR 166并发实用程序
Java 7最有趣的改进之一是对并发的更好支持. 使用JSR 166并发实用程序,我们可以对并发进行一些非常有用的改进. 在我看来,fork-join库在软件工程中具有很高的实际应用潜力. Fork ...
- java 3D 第二章 java 3D基本概念
java 3D 第二章 java 3D基本概念 java 3D基本概念 java 3D的包及其功能 java 3D 高分辨率大尺度坐标 Java 3D场景图(Scene Graph) VirtualU ...
最新文章
- Android 布局中 如何使控件居中
- 非常详细的transformer笔记,包括XLNet, MT-DNN, ERNIE, ERNIE2, RoBERTa
- Facebook:苹果谷歌支持HTML5会死啊
- android 查询wifi信息的类,Android 获取wifi信息
- 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
- 为什么商家数字化离不开交易平台
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
- ElasticSearch索引的基本操作命令
- Xcode中四种build for 的区别
- win11更新后黑屏怎么办 Windows11更新后黑屏的解决方法
- 计算机网络自动分配ip地址,计算机ip地址设置 自动获取IP和静态IP
- 俄罗斯的程序员工资高吗?
- 《Python+Kivy(App开发)从入门到实践》自学笔记:Python文件+.kv 文件实现“Hello world”
- R语言之导入数据源(二)
- 【阿里云-如何实现实名认证】
- 大学概率论与数理统计知识点详细整理
- 网吧无盘系统服务器安装,网吧网络无盘系统的安装方法
- 弘辽科技:拼多多活动价格建议价格太低了怎么办?
- R语言将向量数据按照行方式转化为矩阵数据(设置参数byrow为TRUE)、计算矩阵数据的特征值(eigenvalue)
- win10怎么将计算机放桌面壁纸,win10电脑系统怎么改变桌面壁纸的大小