线程通信2
2015-08-08 16:25
375 查看
使用Condition来控制线程通信:
如果程序不使用synchronized关键字来保证线程同步,而是直接使用Lock对象来保证同步,则系统中不存在隐式的同步监视器,也就不能使用wait(),notify(),notifyAll()方法进行线程通信了。
当使用Lock对象来保证同步时,java提供了一个Condition类来保持协调,使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待的线程。
await(),signal(),signalAll()类似于隐式同步监视器上的wait(),notify(),notifyAll()方法
对比隐式使用同步监视器不难发现,两个程序的逻辑基本相似,只是现在显示使用Lock对象来充当同步监视器,则需要使用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对象来暂停、唤醒指定线程。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统