zoukankan      html  css  js  c++  java
  • condition的使用

    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();
      }
    }
    

      

  • 相关阅读:
    MVC中CheckBox
    Python中的高级数据结构
    高级正则表达式技术(Python版)
    程序员可以兼任项目经理吗?
    浅谈五大Python Web框架
    学习Python编程的11个资源
    Python 代码性能优化技巧
    python多线程ctrl-c退出问题
    Python 笔记 : 类和继承
    Python的OO思想
  • 原文地址:https://www.cnblogs.com/chen--biao/p/11371051.html
Copyright © 2011-2022 走看看