多线程编程艺术(3)-多线程等待通知编程模型
来源:互联网 发布:作品集网站 知乎 编辑:程序博客网 时间:2024/04/30 18:40
本文内容来源于《多线程编程艺术》一书,本人阅读过程的总结
关键知识点:
1、调用wait()方法后,会释放对象的锁
等待方遵循如下原则。
1)获取对象的锁。
2)如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。
3)条件满足则执行对应的逻辑。对应的伪代码如下。
synchronized(对象) { while(条件不满足) { 对象.wait(); } 对应的处理逻辑 }
通知方遵循如下原则。
1)获得对象的锁。
2)改变条件。
3)通知所有等待在对象上的线程。对应的伪代码如下。
synchronized(对象) { 改变条件 对象.notifyAll(); }
代码实例如下:
public class WaitNotify { static boolean flag = true; static Object lock = new Object(); public static void main(String[] args) throws Exception { // TODO Auto-generated method stub 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 { @Override public void run() { // TODO Auto-generated method stub synchronized (lock) { while (flag) { try { System.out.println(Thread.currentThread().getName() + "flag is true," + new SimpleDateFormat("HH:mm:ss").format(new Date())); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 条件满足时,完成工作 System.out.println(Thread.currentThread() + " flag is false. running @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); } } } static class Notify implements Runnable { @Override public void run() { // TODO Auto-generated method stub synchronized (lock) { System.out.println(Thread.currentThread() + " hold lock. notify @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); lock.notifyAll(); flag = false; try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } synchronized (lock) { System.out.println(Thread.currentThread() + " hold lock again. sleep @ " + new SimpleDateFormat("HH:mm:ss").format(new Date())); try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }}
等待通知模型的进化:等待超时模式
在正式的系统环境中,必须设置超时时间,避免未知原因造成无限期等待。
上述描述等待超时模式的伪代码如下。
// 对当前对象加锁public synchronized Object get(long mills) throws InterruptedException { long future = System.currentTimeMillis() + mills; long remaining = mills; // 当超时大于0并且result返回值不满足要求 while ((result == null) && remaining > 0) { wait(remaining); remaining = future - System.currentTimeMillis(); } return result;}
0 0
- 多线程编程艺术(3)-多线程等待通知编程模型
- 《多线程编程》学习之七:等待/通知机制(一)
- 《多线程编程》学习之七:等待/通知机制(二)
- 多线程编程中的等待/通知机制和等待超时模式
- Java多线程编程3--线程间通信--等待(wait)/通知(notify)机制
- Java多线程编程3--线程间通信实例--等待/通知之交叉备份
- Java多线程编程-(16)-等待/通知模式接口Condition接口深入分析
- Java多线程编程-(18)-等待/通知模式接口Condition接口深入分析
- 多线程 等待/通知机制
- 多线程编程模型
- 多线程服务器编程模型
- 多线程编程模型
- 多线程编程模型
- 《Java并发编程的艺术》读书笔记:等待/通知机制
- 多线程抽象编程模型(Python版)
- 多线程编程艺术(2)-安全的终止线程
- 多线程编程艺术(4)-线程间数据传输
- 多线程编程艺术(5)-ThreadLocal的使用
- 使用golang实现telnet远程登录
- json解析原理
- 九度 OJ 1054:字符串内排序
- 2016-05-25 margin-right jsp获取页面流变量 文字颜色
- 合并排序
- 多线程编程艺术(3)-多线程等待通知编程模型
- ListView之ArrayAdapter的使用
- cordys CWS 编译失败 需要指定 JRE
- JAVA 笔记(三) 从源码深入浅出集合框架
- LinkedHashMap源码解析
- Android之TextView效果
- View滑动的原理,解析scrollTo,ScrollBy和Scroller
- 封装一个类处理安卓客户端与服务器端交互
- 轻量web服务器开发日记02-mempool内存池的实现