线程通信2
来源:互联网 发布:paxos算法执行过程 编辑:程序博客网 时间:2024/06/08 02:54
使用Condition来控制线程通信:
如果程序不使用synchronized关键字来保证线程同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能使用wait(),notify(),notifyAll()方法进行线程通信了。
当使用Lock对象来保证同步时,java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待的线程。
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Account_2 { private final Lock lock = new ReentrantLock(); private final Condition cond = lock.newCondition(); private String accountNo; private double balance; private boolean flag = false; public Account_2(){} public Account_2(String accountNo,double balance){ this.accountNo = accountNo; this.balance = balance; } public double getBalance(){ return this.balance; } public void draw(double drawAmount){ lock.lock(); try { if (!flag) { cond.await(); } else { System.out.println(Thread.currentThread().getName() +" 取钱:"+drawAmount); balance -= drawAmount; System.out.println("账户余额为: "+balance); flag = false; cond.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); } //使用finally来释放锁 finally{ lock.unlock(); } } public void deposit(double depositAmount){ lock.lock(); try { if (flag) { cond.await(); } else { System.out.println(Thread.currentThread().getName() +" 存款:"+depositAmount); balance += depositAmount; System.out.println("账户余额为: "+balance); flag = true; cond.signalAll(); } } catch (InterruptedException e) { e.printStackTrace(); }finally{ lock.unlock(); } }}
await(),signal(),signalAll()类似于隐式同步监视器上的wait(),notify(),notifyAll()方法
对比隐式使用同步监视器不难发现,两个程序的逻辑基本相似,只是现在显示使用Lock对象来充当同步监视器,则需要使用Condition对象来暂停、唤醒指定线程。
0 0
- 线程通信2
- 线程间通信2
- 线程通信2
- 线程通信(2)
- 线程2:线程通信事件机制(单线程、两个线程、多个线程通信)
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- 线程通信
- linux 下 c++ 多线程的实现
- angular.js笔记 ---关于Route路由
- Scala 深入浅出实战经典 第80讲:scala中List的泛型分析以及::类和Nil对象
- java 排序
- Android性能优化典范 - 第2季
- 线程通信2
- 136.Single Number
- 文件系统(3.6)------嵌入式系统软件及操作系统知识
- hdu 4006 The kth great number(线段树 || 优先队列)
- HDU2542 矩形A + B
- HDU - 1312 Red and Black (dfs)
- A1080. Graduate Admission (30)
- python3使用ltp语言云
- jQuery 加载等待 转圈