Java编程中实现编程中实现Condition控制线程通信控制线程通信
主要介绍了Java编程中实现Condition控制线程通信,简单介绍了Java中控制线程通信的方法,以及对condition
的解析和实例,具有一定参考价值,需要的朋友可以了解下。
java中控制线程通信的方法中控制线程通信的方法
1.传统的方式:利用synchronized关键字来保证同步,结合wait(),notify(),notifyAll()控制线程通信。不灵活。
2.利用Condition控制线程通信,灵活。
3.利用管道pipe进行线程通信,不推荐
4.利用BlockingQueue控制线程通信
本文就讲解利用Condition控制线程通信,非常灵活的方式。
Condition类是用来保持Lock对象的协调调用。
对Lock不了解的可以参考:Java线程同步Lock同步锁代码示例
Condition介绍介绍
使用Condition可以让那些已经得到lock对象却无法继续执行的线程释放lock对象,Condition对象也可以唤醒处于等待的线程。
Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组
合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了
Object 监视器方法的使用。
Condition 实例实质上被绑定到一个锁上。要为特定 Lock 实例获得 Condition 实例,使用其 newCondition() 方法。
Condition类提供了如下三个方法:
await():造成当前线程在接到信号或被中断之前一直处于等待状态。 该方法流程:
1.新建Condition Node包装线程,加入Condition队列。
2.释放当前线程占有的锁
3.阻塞当前线程
signal():唤醒当前lock对象的一个等待线程。signal方法只是将Node(await方法封装的)修改了状态,并没有唤醒线程。要将
修改状态后的Node唤醒,一种是再次调用await(),一种是调用unlock()。//这局句很重要,不明白的可以看我下一篇博客。
signalAll():唤醒当前lock对象的所有等待线程。只有当前线程放弃对lock的锁定,被唤醒的线程才可以执行。
代码实例:
代码逻辑:Account类实现同步的取钱(draw)、存钱(deposit)操作;DrawThread循环取钱的线程、DepositThread循环
存钱的线程。
Account:
package condition;
import java.util.concurrent.locks.*;
/**
*存钱、取钱
*/
public class Account
{
//显示定义Lock对象
private final Lock lock = new ReentrantLock();//可重入锁
//获得指定Lock对象对应的条件变量
private final Condition cond = lock.newCondition(); //获得condition实例
private String accountNo;
private double balance;
//标识账户中是否已经存款的旗标
private boolean flag = false;
public Account(){}
public Account(String accountNo , double balance)
{
this.accountNo = accountNo;
this.balance = balance;
}