zoukankan      html  css  js  c++  java
  • Condition

    condition.await()

    condition.signalAll()

    package concurrent._Condition;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Demo {
        public static void main(String[] args) throws InterruptedException {
    
            ReentrantLock lock = new ReentrantLock();
            //Condition 类是AQS的一个内部类
            Condition condition = lock.newCondition();
    
            ThreadA a1= new ThreadA("a1",lock,condition);
            ThreadA a2 = new ThreadA("a2",lock,condition);
            ThreadA a3 = new ThreadA("a3",lock,condition);
            ThreadB b = new ThreadB("b",lock,condition);
            a1.start();
            a2.start();
            a3.start();
            Thread.sleep(500);
            b.start();
    
        }
    
    
    }
    class ThreadA extends  Thread{
        private Lock lock;
        private Condition condition;
        ThreadA(String name,Lock lock,Condition condition){
            super(name);
            this.lock = lock;
            this.condition = condition;
        }
    
        @Override
        public void run() {
            String threadName = this.getName();
            lock.lock();
            System.out.println(threadName + "已经获得锁");
            try {
                System.out.println(threadName + "等待一个条件");
                condition.await();
                System.out.println(threadName + "从挂起状态醒来");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
    
                //System.out.println(threadName + "提供了一个条件");
                //condition.signal();
                System.out.println(threadName + "释放了锁");
                lock.unlock();
            }
        }
    }
    
    class ThreadB extends  Thread{
        private Lock lock;
        private Condition condition;
        ThreadB(String name,Lock lock,Condition condition){
            super(name);
            this.lock = lock;
            this.condition = condition;
        }
    
        @Override
        public void run() {
            String threadName = this.getName();
            lock.lock();
            System.out.println(threadName + "已经获得锁");
            System.out.println(threadName + "提供一个条件");
            condition.signalAll();
            System.out.println(threadName + "释放了锁");
            lock.unlock();
        }
    }

    结果显示:

    a1已经获得锁
    a1等待一个条件
    a2已经获得锁
    a2等待一个条件
    a3已经获得锁
    a3等待一个条件
    b已经获得锁
    b提供一个条件
    b释放了锁
    a1从挂起状态醒来
    a1释放了锁
    a2从挂起状态醒来
    a2释放了锁
    a3从挂起状态醒来
    a3释放了锁

    将ThreadB中改为唤起一个已经挂起的进程

    将ThradA中改为每次释放锁之前唤起一个已经挂起线程

    ThreadA

    finally {
    
                System.out.println(threadName + "提供了一个条件");
                condition.signal();
                System.out.println(threadName + "释放了锁");
                lock.unlock();
            }

    ThreadB

    public void run() {
            String threadName = this.getName();
            lock.lock();
            System.out.println(threadName + "已经获得锁");
            System.out.println(threadName + "提供一个条件");
            condition.signal();
            System.out.println(threadName + "释放了锁");
            lock.unlock();
        }

    结果:

    a1已经获得锁
    a1等待一个条件
    a3已经获得锁
    a3等待一个条件
    a2已经获得锁
    a2等待一个条件
    b已经获得锁
    b提供一个条件
    b释放了锁
    a1从挂起状态醒来
    a1提供了一个条件
    a1释放了锁
    a3从挂起状态醒来
    a3提供了一个条件
    a3释放了锁
    a2从挂起状态醒来
    a2提供了一个条件
    a2释放了锁
  • 相关阅读:
    根据系统的pid查询sql语句
    DORADO实现动态拼装查询条件
    一个Spring的配置管理接口
    MS SQL Server Management Studio连接到SQL Server命名实例的方法
    WSDL学习笔记
    显示MyBatis/Ibatis的SQL语句
    测试代码显示
    C#中一个项目中无法引用另外一个项目中的类的问题
    Learn How To Use LogMiner(Practice)
    WIN2003 IIS6 FastCGI php5.33配置重点
  • 原文地址:https://www.cnblogs.com/da-peng/p/10019084.html
Copyright © 2011-2022 走看看