首页 > 其他 > 详细

condition

时间:2019-08-18 01:16:10      阅读:94      评论:0      收藏:0      [点我收藏+]

condition 的作用:条件锁

需求:

  按需执行三个线程。

用wait,notify的方式:  

/**
 * 有序线程 wait,notify版
 */
public class OrderThreadW_NVersion {
  private int flag=0;

  public synchronized void A(){
    while (flag != 0){
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("A");
    flag=1;
    notifyAll();
  }
  public synchronized void B(){
    while (flag != 1){
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("B");
    flag=2;
    notifyAll();
  }
  public synchronized void C(){
    while (flag != 2){
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("C");
    flag=0;
    notifyAll();
  }


  public static void main(String[] args) {
    OrderThreadW_NVersion ot = new OrderThreadW_NVersion();
    new Thread(()->{
      while (true){
        ot.A();
        try {
          Thread.sleep(500);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }).start();
    new Thread(()->{
      while (true){
        ot.B();
        try {
          Thread.sleep(500);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }).start();
    new Thread(()->{
      while (true){
        ot.C();
        try {
          Thread.sleep(500);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }).start();
  }
}

缺点:

  notifyAll,会唤醒所有等待的线程,不能指定特定线程的唤醒。此时就引入了condition

 

用condition的方式来实现:

/**
 * 有序线程,conditin版
 */
public class OrderThreadCondition {

  private int flag = 0;
  Lock lock = new ReentrantLock();
  Condition a = lock.newCondition();
  Condition b = lock.newCondition();
  Condition c = lock.newCondition();

  public void A() {
    lock.lock();
    while (flag != 0) {
      try {
        a.await();//跟object的wait一样
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("A");
    flag = 1;
    b.signal();//唤醒指定线程
    lock.unlock();
  }


  public void B() {
    lock.lock();
    while (flag != 1) {
      try {
        b.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("B");
    flag = 2;
    c.signal();
    lock.unlock();
  }

  public void C() {
    lock.lock();
    while (flag != 2) {
      try {
        c.await();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
    System.out.println("C");
    flag = 0;
    a.signal();
    lock.unlock();
  }

  public static void option(OrderThreadCondition ot,String methodName){
    while (true){
      try {
        Method method = ot.getClass().getMethod(methodName, null);
        method.invoke(ot,null);
        Thread.sleep(1000);
      } catch (Exception e) {
        e.printStackTrace();
        System.exit(-1);
      }
    }
  }

  public static void main(String[] args) {
    OrderThreadCondition ot = new OrderThreadCondition();
    new Thread(() -> option(ot,"A")).start();
    new Thread(() -> option(ot,"B")).start();
    new Thread(() -> option(ot,"C")).start();
  }
}

  

condition

原文:https://www.cnblogs.com/chen--biao/p/11371051.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!