• 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释放了锁
  • 相关阅读:
    《自己动手写操作系统》:开发环境配置心得
    sip.conf配置详情
    MySQL字符串中数字排序的问题
    Asterisk iax错误提示
    Python 快速入门
    C# winfrom 导出word
    SetWindowsHookEx函数参数详解
    Ubuntu Linux系统下轻松架设nginx+php服务器应用
    TShockwaveFlash的使用
    检讨
  • 原文地址:https://www.cnblogs.com/da-peng/p/10019084.html
Copyright © 2020-2023  润新知