一、等待与通知

public final void wait() throws InterruptedException

等待条件的发生。
public final void wait(long timeout) throws InterruptedException
     等待条件的发生。假设通知没有在timeout指定的时间内发生,它还是会返回。
public final void wait(long timeout, int nanos) throws InterruptedException
等待条件的发生。

假设通知没有在timeout指定的毫秒与纳秒内发生。它还是会返回。

public final void notify()
     通知正在等待的Thread此条件已经发生。
public final void notifyAll()
通知全部正在等待的Thread此条件已经发生。
    等待-通知机制的目的为何?它是怎样运作的? 
     等待-通知机制是同步机制。它更是一个通信机制:它可以让某个Thread与其它Thread在特定条件符合时进行通信。等待-通知机制并没有指定特定条件是什么。
    等待-通知机制可以用来代替synchronized机制吗?
     不行。wait、notify、notifyAll方法方法必须从synchronized方法块中调用,由于须要其确保等待与通知的线程安全不会出现竞态条件。
public class AnimatedCharacterDisplayCanvas extends CharacterDisplayCanvas implements CharacterListener, Runnable {private boolean done = true;private int curX = 0;private Thread timer = null;public AnimatedCharacterDisplayCanvas() {}public AnimatedCharacterDisplayCanvas(CharacterSource cs) {super(cs);}public synchronized void newCharacter(CharacterEvent ce) {curX = 0;tmpChar[0] = (char) ce.character;repaint();}protected synchronized void paintComponent(Graphics gc) {Dimension d = getSize();gc.clearRect(0, 0, d.width, d.height);if (tmpChar[0] == 0)return;int charWidth = fm.charWidth(tmpChar[0]);gc.drawChars(tmpChar, 0, 1,curX++, fontHeight);}public synchronized void run() {while (true) {try {if (done) {wait();} else {repaint();wait(100);}} catch (InterruptedException ie) {return;}}}public synchronized void setDone(boolean b) {done = b;if (timer == null) {timer = new Thread(this);timer.start();}if (!done)notify();}}

     sleep与wait方法的差别?
     wait与notify方法都必须在同步方法中。在一个类中的两个同步方法使用的都是当前this作为锁,wait方法运行后会释放掉当前方法锁。由于假设不释放的话notify永远无法获取到此锁,也就永远无法运行notify。
     sleep方法是不会释放锁的,而且堵塞当前线程,一直到sleep指定的时间结束。
等待-通知机制与同步
存在于等待-通知机制中的竞态条件细节是什么?
1. 第一个Thread測试条件并确认它须要等待
2. 第二个Thread设定此条件
3. 第二个Thread调用notify方法,这不会被收到。由于第二个Thread还没有进入等待
4. 第一个Thread调用wait方法
这个潜在的竞态条件状况是怎样解决的? 
     调用wait与调用notify的方法都使用同一锁(当前对象this)。由锁来保证操作的原子性。
假设Thread收到通知,是否可以保证条件被正确的设定?
     不是。描写叙述情景
wait(), notify() 与 notifyAll()
当一个以上的Thread在等待通知时哪个Thread会在调用notify的时候收到通知?
     Java规范未定义哪一个Thread收到通知。

可是Object class 提供另外一个方法notifyAll

是否noitfyAll方法真的唤醒全部的Thread?
     是也不是。

全部等待中Thread都会被唤醒,但它们都还没要又一次取得对象的lock。所以这些Thread并非并行地运行:它们都必须等待对象lock被释放掉。

因此,一次仅仅有一个Thread可以运行,且仅仅有在调用notifyAll方法的这个Thread释放掉它的lock之后。

为什么要唤醒全部的Thread?
     1. 有多个Thread处于等待状态,无法指定哪一个收到通知
     2. 并不知道详细有多少个Thread处于等待,干脆同步通知。由等待中的Thread自己处理。
等待-通知机制与synchronized块
public class AnimatedCharacterDisplayCanvas extends CharacterDisplayCanvas implements CharacterListener, Runnable {private boolean done = true;private int curX = 0;private Thread timer = null;private Object doneLock = new Object();public AnimatedCharacterDisplayCanvas() {}public AnimatedCharacterDisplayCanvas(CharacterSource cs) {super(cs);}public synchronized void newCharacter(CharacterEvent ce) {curX = 0;tmpChar[0] = (char) ce.character;repaint();}protected synchronized void paintComponent(Graphics gc) {Dimension d = getSize();gc.clearRect(0, 0, d.width, d.height);if (tmpChar[0] == 0)return;int charWidth = fm.charWidth(tmpChar[0]);gc.drawChars(tmpChar, 0, 1,curX++, fontHeight);}public void run() {synchronized(doneLock) {while (true) {try {if (done) {doneLock.wait();} else {repaint();doneLock.wait(100);}} catch (InterruptedException ie) {return;}}}}public void setDone(boolean b) {synchronized(doneLock) {done = b;if (timer == null) {timer = new Thread(this);timer.start();}if (!done)doneLock.notify();}}}

二、条件变量

POSIX条件变量的四个基本函数:wait(), thimeed_wait(), signal, broadcast。直接相应Java提供的wait(), wait(long),notify(),notifyAll

     J2SE 5.0增加提供条件变量功能的类。

此类食欲Lock interface并用。由于这个新的interface是与调用以及lock对象分开的,它在用法上的灵活性就如筒其它Threading系统中的条件变量一样。

public class RandomCharacterGenerator extends Thread implements CharacterSource {private static char[] chars;private static String charArray = "abcdefghijklmnopqrstuvwxyz0123456789";static {chars = charArray.toCharArray();}private Random random;private CharacterEventHandler handler;private boolean done = true;private Lock lock = new ReentrantLock();private Condition cv = lock.newCondition();public RandomCharacterGenerator() {random = new Random();handler = new CharacterEventHandler();}public int getPauseTime() {return (int) (Math.max(1000, 5000 * random.nextDouble()));}public void addCharacterListener(CharacterListener cl) {handler.addCharacterListener(cl);}public void removeCharacterListener(CharacterListener cl) {handler.removeCharacterListener(cl);}public void nextCharacter() {handler.fireNewCharacter(this,(int) chars[random.nextInt(chars.length)]);}public void run() {try {lock.lock();while (true) {try {if (done) {cv.await();} else {nextCharacter();cv.await(getPauseTime(), TimeUnit.MILLISECONDS);}} catch (InterruptedException ie) {return;}}} finally {lock.unlock();}}public void setDone(boolean b) {try {lock.lock();done = b;if (!done) cv.signal();} finally {lock.unlock();}}
}

     为什么使用Condition而不使用wait与notify?或者说是二者的差别?
     1. Condition与wait同样都是由于须要确保同步安全(即避免竞态条件)而必须使用锁机制保证。
     2. Lock对象不能与wait、notify方法搭配。由于这些方法已经在内部被用来实现Lock对象,持有lock对象并不表示持有了该对象的同步锁。
     3. Condition对象不像等待-通知机制,它是被创建不同的对象。

对每个Lock对象都能够创建一个以上的Condition对象。这表示我们能够针对个别的Thread或ThreadGroup进行独立的设定。

Condition方法:
void await()
     等待条件的发生。
void awaitUniterruptibly()
     等待条件的发生。

与await()不同,它的调用不可能被中断。

void signal()
     通知某个等待使用Condition对象的Thread此条件已经发生。
void signalAll()
     通知全部等待使用Condition对象的Thread此条件已经发生。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5408968.html,如需转载请自行联系原作者

Java 线程第三版 第四章 Thread Notification 读书笔记相关推荐

  1. 《深入理解JAVA虚拟机》周志明 第三版 - 第四章 虚拟机性能监控、故障处理工具

    4.1 概述 恰当地使用虚拟机故障处理.分析的工具可以提升我们分析数据.定位并解决问题的效率. 4.2 基础故障处理工具 JDK的bin目录中有java.exe.javac.exe这两个命令行工具,还 ...

  2. 计算机应用基础周南岳第三版第四章教案,《计算机应用基础》(周南岳)配套电子教案第4章...

    <<计算机应用基础>(周南岳)配套电子教案第4章>由会员分享,可在线阅读,更多相关<<计算机应用基础>(周南岳)配套电子教案第4章(44页珍藏版)>请在 ...

  3. 谭浩强c程序设计试题汇编第三版 第四章解析

    我是谭老的学生 但是居然他的书没有解析! 第四章节部分 暂未写完 等待后续 欢迎一起交流这本习题! 11月3日更新

  4. 图像处理-离散傅里叶变换-数字图像处理第三版第四章内容

    图像傅里叶变换方法有很多,可以通过空间光调制器输入图像后在通过平行光照明经过傅里叶变换透镜进行傅里叶变换,另一个方法就是利用计算机进行傅里叶变换,其中傅里叶变换有两种算法一种是DFT还有一种是FFT( ...

  5. python核心编程第3版第1章 正则表达式【读书笔记】

    什么是正则表达式 正则表达式为高级的本文模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串. re模块 python通 ...

  6. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

    Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...

  7. 04737 c++ 自学考试2019版 第四章课后练习 程序设计题 2

    /* * 04737 c++ 自学考试2019版 第四章课后练习 * 程序设计题 2 * 需求:为第二章习题设计中的二维坐标系下的类point,重载<< >> */ //标准流 ...

  8. 数据结构(C语言)第二版 第四章课后答案

    数据结构(C语言)第二版 第四章课后答案 1~5 B B C A B 6~10 B B C B B 11~15 A B D (C,B) C 1.选择题 (1)串是一种特殊的线性表,其特殊性体现在(B) ...

  9. SQL基础教程MICK版 --第四章总结

    SQL基础教程MICK版 ···第四章总结 DML操作.事务的概念.性质.和表现形式 DML操作之INSERT DML操作之UPDATE DML操作之DELETE.TRUNCATE 事务的概念,DBM ...

最新文章

  1. 终于要揭开神秘面纱?Magic Leap将要展示产品
  2. hdu 2222:Keywords Search
  3. OpenGL blending 混合的实例
  4. 数据库系统原理(第一章概述)
  5. 【tenserflow】——数据类型以及常用属性
  6. oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
  7. C#与matlab混合编程
  8. (77)译码器与编码器(八三编码器)
  9. 在Updatepanel中使用Response.Redirect
  10. DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
  11. 视频教程-区块链技术通俗讲解-区块链
  12. MATLAB角度转换
  13. 洛谷 P3403 跳楼机
  14. 极速解决“微信PC新版文件保存至MsgAttach”问题
  15. pandas 中上下两行相减(隔行相减) -- shift函数的使用
  16. c语言调试过程中的错误,C语言调试过程中duplicate symbol错误分析
  17. MD 风格的 Dialog ---- MaterialDialog
  18. 跳跃游戏 Jump Game 分析与整理
  19. pandas学习之pandas基础
  20. Bestcoder-889-1001-Drink(HDOJ6743)

热门文章

  1. transactionscope 中的异步 处理 异常_协程中的取消和异常 | 异常处理详解
  2. ef 在此上下文中只支持基本类型或枚举类型_Java 中的 6 颗语法糖
  3. SQL游标(cursor)详细说明及内部循环使用示例
  4. 国外计算机音乐专业,音乐留学干货 | 国外电子音乐专业留学如何?
  5. mysql大于等于怎么写_数据库中大于等于0小于等于100怎样表达
  6. php 实现tab切换_微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码)...
  7. oracle 状态unknown,解决Oracle crs_stat状态为UNKNOWN有关问题
  8. STM32CubedMX 下载与安装
  9. 2021年春季学期-信号与系统-第一次作业参考答案-第一题
  10. 最好的浏览器排行榜_PG是最好的数据库;TiDB 4.0前瞻;SequoiaDB高可用原理;20c DG新特性... 数据库周刊第18期...