Java 线程第三版 第四章 Thread Notification 读书笔记
一、等待与通知
public final void wait() throws InterruptedException
等待条件的发生。假设通知没有在timeout指定的时间内发生,它还是会返回。
假设通知没有在timeout指定的毫秒与纳秒内发生。它还是会返回。
通知正在等待的Thread此条件已经发生。
public final void notifyAll()
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();}}
可是Object class 提供另外一个方法notifyAll
全部等待中Thread都会被唤醒,但它们都还没要又一次取得对象的lock。所以这些Thread并非并行地运行:它们都必须等待对象lock被释放掉。
因此,一次仅仅有一个Thread可以运行,且仅仅有在调用notifyAll方法的这个Thread释放掉它的lock之后。
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
此类食欲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();}}
}
对每个Lock对象都能够创建一个以上的Condition对象。这表示我们能够针对个别的Thread或ThreadGroup进行独立的设定。
与await()不同,它的调用不可能被中断。
Java 线程第三版 第四章 Thread Notification 读书笔记相关推荐
- 《深入理解JAVA虚拟机》周志明 第三版 - 第四章 虚拟机性能监控、故障处理工具
4.1 概述 恰当地使用虚拟机故障处理.分析的工具可以提升我们分析数据.定位并解决问题的效率. 4.2 基础故障处理工具 JDK的bin目录中有java.exe.javac.exe这两个命令行工具,还 ...
- 计算机应用基础周南岳第三版第四章教案,《计算机应用基础》(周南岳)配套电子教案第4章...
<<计算机应用基础>(周南岳)配套电子教案第4章>由会员分享,可在线阅读,更多相关<<计算机应用基础>(周南岳)配套电子教案第4章(44页珍藏版)>请在 ...
- 谭浩强c程序设计试题汇编第三版 第四章解析
我是谭老的学生 但是居然他的书没有解析! 第四章节部分 暂未写完 等待后续 欢迎一起交流这本习题! 11月3日更新
- 图像处理-离散傅里叶变换-数字图像处理第三版第四章内容
图像傅里叶变换方法有很多,可以通过空间光调制器输入图像后在通过平行光照明经过傅里叶变换透镜进行傅里叶变换,另一个方法就是利用计算机进行傅里叶变换,其中傅里叶变换有两种算法一种是DFT还有一种是FFT( ...
- python核心编程第3版第1章 正则表达式【读书笔记】
什么是正则表达式 正则表达式为高级的本文模式匹配.抽取.与/或文本形式的搜索和替换功能提供了基础.简单地说,正则表达式(简称为regex)是一些由字符和特殊符号组成的字符串. re模块 python通 ...
- Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25
Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...
- 04737 c++ 自学考试2019版 第四章课后练习 程序设计题 2
/* * 04737 c++ 自学考试2019版 第四章课后练习 * 程序设计题 2 * 需求:为第二章习题设计中的二维坐标系下的类point,重载<< >> */ //标准流 ...
- 数据结构(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) ...
- SQL基础教程MICK版 --第四章总结
SQL基础教程MICK版 ···第四章总结 DML操作.事务的概念.性质.和表现形式 DML操作之INSERT DML操作之UPDATE DML操作之DELETE.TRUNCATE 事务的概念,DBM ...
最新文章
- 终于要揭开神秘面纱?Magic Leap将要展示产品
- hdu 2222:Keywords Search
- OpenGL blending 混合的实例
- 数据库系统原理(第一章概述)
- 【tenserflow】——数据类型以及常用属性
- oracle 查询时间点数据_oracle统计时间段内每一天的数据(推荐)
- C#与matlab混合编程
- (77)译码器与编码器(八三编码器)
- 在Updatepanel中使用Response.Redirect
- DotNET企业架构应用实践-数据库表记录的唯一性设计的设计兼议主键设定原则
- 视频教程-区块链技术通俗讲解-区块链
- MATLAB角度转换
- 洛谷 P3403 跳楼机
- 极速解决“微信PC新版文件保存至MsgAttach”问题
- pandas 中上下两行相减(隔行相减) -- shift函数的使用
- c语言调试过程中的错误,C语言调试过程中duplicate symbol错误分析
- MD 风格的 Dialog ---- MaterialDialog
- 跳跃游戏 Jump Game 分析与整理
- pandas学习之pandas基础
- Bestcoder-889-1001-Drink(HDOJ6743)
热门文章
- transactionscope 中的异步 处理 异常_协程中的取消和异常 | 异常处理详解
- ef 在此上下文中只支持基本类型或枚举类型_Java 中的 6 颗语法糖
- SQL游标(cursor)详细说明及内部循环使用示例
- 国外计算机音乐专业,音乐留学干货 | 国外电子音乐专业留学如何?
- mysql大于等于怎么写_数据库中大于等于0小于等于100怎样表达
- php 实现tab切换_微信小程序实例:实现顶部tab切换以及滑动切换时导航栏会随着移动的效果(代码)...
- oracle 状态unknown,解决Oracle crs_stat状态为UNKNOWN有关问题
- STM32CubedMX 下载与安装
- 2021年春季学期-信号与系统-第一次作业参考答案-第一题
- 最好的浏览器排行榜_PG是最好的数据库;TiDB 4.0前瞻;SequoiaDB高可用原理;20c DG新特性... 数据库周刊第18期...