如何在Java中使用条件控制线程通信

  介绍

本篇文章给大家分享的是有关如何在Java中使用条件控制线程通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>一点睛

当使用锁对象来保证同步时,Java提供了一个状态类来保持协调,使用条件可以让那些已经得到锁对象,却无法继续执行的线程释放锁对象,状态对象也可以唤醒其他处于等待的线程。

条件将同步监视锁方法(等待,通知和notifyAll)分解成截然不同的对象,以便通过将这些对象与锁对象组合使用,为每个对象提供多个等待集(等候集)。在这种情况下,锁替代了同步方法或同步代码块,条件替代了同步监视锁的功能。

条件实例实质上被绑定在一个锁对象上。要获得特定锁实例的条件实例,调用锁对象newCondition()方法即可.Condtion类提供了如下三个方法:

等待():类似于隐式同步监视器上的等待()方法,导致当前线程等待,直到其他线程调用该状态的信号()方法或signalAll()方法来唤醒该线程。该等待方法有更多变体:长awaitNanos(长nanosTimeout),空白awaitUninterruptibly (), awaitUntil(日期截止日期)等,可以完成更丰富的等待操作。

信号():唤醒在此锁对象上等待的单个线程。如果所有线程都在该锁对象上等待,则会选择唤醒其中一个线程。选择是任意性的。只有当前线程放弃对该锁对象的锁定后(使用等待()方法),才可以执行被唤醒的线程。

signalAll():唤醒在此锁对象上等待的所有线程。只有当前线程放弃对该该锁对象的锁定后,才可以执行被唤醒的线程。

<强>二代码

1账户类

public  class 帐户   {   ,,//,显式定义锁对象   ,,private  final  Lock  Lock =, new  ReentrantLock ();//,,,获得指定锁对象对应的条件   ,,private  final  Condition  cond =, lock.newCondition ();   ,,//,封装账户编号,账户余额的两个成员变量   ,,private  String  accountNo;   ,,private  double 平衡;   ,,//,标识账户中是否已有存款的旗标   ,,private  boolean  flag =,假;   ,,public 帐户(){}   ,,//,构造器   ,,public 帐户(String  accountNo ,, double 平衡)   ,,{   ,,,,,this.accountNo =, accountNo;   ,,,,,this.balance =,平衡;   ,,}   ,,//,accountNo的setter和getter方法   ,,public  void  setAccountNo (String  accountNo)   ,,{   ,,,,,this.accountNo =, accountNo;   ,,}   ,,public  String  getAccountNo ()   ,,{   ,,,,,return  this.accountNo;   ,,}   ,,//,因此账户余额不允许随便修改,所以只为平衡提供getter方法,   ,,public  double  getBalance ()   ,,{   ,,,,,return  this.balance;   ,,}   ,,public  void 画(double  drawAmount)   ,,{   ,,,,,//,加锁   ,,,,,lock.lock ();   ,,,,,试一试   ,,,,,{   ,,,,,,,//,如果国旗为假,表明账户中还没有人存钱进的去,取钱方法阻塞   ,,,,,,,if 国旗(!)   ,,,,,,,{   ,,,,,,,,,,cond.await ();   ,,,,,,,}   ,,,,,,,   ,,,,,,,{   ,,,,,,,,,,//,执行取钱   ,,,,,,,,,,System.out.println (Thread.currentThread () . getname ()   ,,,,,,,,,,,,,+,“,取钱:“,+,drawAmount);   ,,,,,,,,,,balance  -=, drawAmount;   ,,,,,,,,,,System.out.println(“账户余额为:“,+,平衡);   ,,,,,,,,,,//,将标识账户是否已有存款的旗标设为false。   ,,,,,,,,,,flag =,假;   ,,,,,,,,,,//,唤醒其他线程   ,,,,,,,,,,cond.signalAll ();   ,,,,,,,}   ,,,,,}   ,,,,,catch  (InterruptedException 交货)   ,,,,,{   ,,,,,,,ex.printStackTrace ();   ,,,,,}   ,,,,,//,使用最后块来释放锁   ,,,,最后   ,,,,,{   ,,,,,,,lock.unlock ();   ,,,,,}   ,,}   ,,public  void 存款(double  depositAmount)   ,,{   ,,,,,lock.lock ();   ,,,,,试一试   ,,,,,{   ,,,,,,,//,如果国旗为真,表明账户中已有人存钱进的去,则存钱方法阻塞   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在Java中使用条件控制线程通信