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()相关推荐

  1. Java编程思想读书笔记--第21章并发

    1.基本的线程机制 定义任务 public class LiftOff implements Runnable{protected int countDown = 10;private static ...

  2. 《JAVA编程思想》学习笔记:第21章(并发)

    目录 Java编程思想(一)第1~4章:概述 Java编程思想(二)第5章:初始化和清理 Java编程思想(三)第6章:访问权限 Java编程思想(四)第7章:复用类 Java编程思想(五)第8章:多 ...

  3. 《Kotlin从小白到大牛》第21章:Kotlin与Java混合编程

    第21章 Kotlin与Java混合编程 Kotlin毕竟还是一种新的语言,所以很多项目.组件和框架还是用Java开发的,目前Kotlin不能完全取代Java,因此有时会使用Kotlin调用Java写 ...

  4. 第二十四章 并发编程

    第二十四章 并发编程 爱丽丝:"但是我不想进入疯狂的人群中" 猫咪:"oh,你无能为力,我们都疯了,我疯了,你也疯了" 爱丽丝:"你怎么知道我疯了&q ...

  5. CoreJava 笔记总结-第十二章 并发-2

    文章目录 第十二章 并发 `synchronized`关键字 同步块 监视器概念 `volatile`字段 `final`变量 原子性 死锁 线程安全的集合 阻塞队列 映射条目的原子更新 对并发散列映 ...

  6. CoreJava 笔记总结-第十二章 并发-1

    第十二章 并发 线程 package chapter12_concurrent.threads;public class ThreadsTest {public static final int DE ...

  7. java ee api_Java EE并发API教程

    java ee api 这是一个示例章节,摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 . 本章讨论了新的Java EE并发API(JSR 236) , ...

  8. java jsr_分叉并加入Java 7 – JSR 166并发实用程序

    java jsr Java 7最有趣的改进之一是对并发的更好支持. 借助JSR 166并发实用程序,我们获得了一些非常有用的并发改进. 在我看来,fork-join库在软件工程中具有很高的实际应用潜力 ...

  9. 分叉并加入Java 7 – JSR 166并发实用程序

    Java 7最有趣的改进之一是对并发的更好支持. 使用JSR 166并发实用程序,我们可以对并发进行一些非常有用的改进. 在我看来,fork-join库在软件工程中具有很高的实际应用潜力. Fork ...

  10. java 3D 第二章 java 3D基本概念

    java 3D 第二章 java 3D基本概念 java 3D基本概念 java 3D的包及其功能 java 3D 高分辨率大尺度坐标 Java 3D场景图(Scene Graph) VirtualU ...

最新文章

  1. Android 布局中 如何使控件居中
  2. 非常详细的transformer笔记,包括XLNet, MT-DNN, ERNIE, ERNIE2, RoBERTa
  3. Facebook:苹果谷歌支持HTML5会死啊
  4. android 查询wifi信息的类,Android 获取wifi信息
  5. 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
  6. 为什么商家数字化离不开交易平台
  7. [bzoj4881][Lydsy2017年5月月赛]线段游戏
  8. ElasticSearch索引的基本操作命令
  9. Xcode中四种build for 的区别
  10. win11更新后黑屏怎么办 Windows11更新后黑屏的解决方法
  11. 计算机网络自动分配ip地址,计算机ip地址设置 自动获取IP和静态IP
  12. 俄罗斯的程序员工资高吗?
  13. 《Python+Kivy(App开发)从入门到实践》自学笔记:Python文件+.kv 文件实现“Hello world”
  14. R语言之导入数据源(二)
  15. 【阿里云-如何实现实名认证】
  16. 大学概率论与数理统计知识点详细整理
  17. 网吧无盘系统服务器安装,网吧网络无盘系统的安装方法
  18. 弘辽科技:拼多多活动价格建议价格太低了怎么办?
  19. R语言将向量数据按照行方式转化为矩阵数据(设置参数byrow为TRUE)、计算矩阵数据的特征值(eigenvalue)
  20. win10怎么将计算机放桌面壁纸,win10电脑系统怎么改变桌面壁纸的大小

热门文章

  1. 天问: 世界到底由什么组成?
  2. html excel 2位小数,excel保留两位小数_excel用公式保留2位小数的方法
  3. QCA6174A方案PCI-E接口双频蓝牙WiFi二合一模块8274B-PR
  4. 苹果M1如何安装Rosetta
  5. Python基础-Week2
  6. bzoj5064 B-number 数位dp
  7. Aggressive cows--二分法思想
  8. 无限滚动新一代老虎机
  9. TortoiseGit解决冲突
  10. php怎么将农历转换成公历,PHP实现阳历到农历转换的类实例