zoukankan      html  css  js  c++  java
  • Condition实现等待、唤醒

    Condition 接口是 JDK 1.5 开始提供的,用来实现线程间的等待与唤醒

    Condition 的对象可以通过 Lock 对象的 newCondition() 方法创建

    Condition 对象方法的调用必须在 Lock 对象的 lock() 和 unlock() 之间,否则会抛出异常 java.lang.IllegalMonitorStateException

    Condition 的 await()、signal()、signalAll() 方法与 Object 的 wait()、notify()、notifyAll() 方法功能类似

    Condition 接口的方法包括

    //当前线程等待,直到收到唤醒的信号或者被中断
    void await() throws InterruptedException;
    //当前线程等待,直到收到唤醒的信号,不可被中断
    void awaitUninterruptibly();
    //当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的等待纳秒数超时
    long awaitNanos(long nanosTimeout) throws InterruptedException;
    //当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的时间超时
    boolean await(long time, TimeUnit unit) throws InterruptedException;
    //当前线程等待,直到收到唤醒的信号 或 被中断 或 超过指定时间
    boolean awaitUntil(Date deadline) throws InterruptedException;
    //唤醒一个等待中的线程
    void signal();
    //唤醒所有等待中的线程
    void signalAll();

    使用示例:

    package constxiong.interview;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * 测试 Lock Condition 的使用
     * @author ConstXiong
     * @date 2019-12-09 11:46:17
     */
    public class TestLockCondition {
        
        public static void main(String[] args) throws InterruptedException {
            Lock lock = new ReentrantLock();
            Condition condition = lock.newCondition();
            
            for (int i = 0; i < 5; i++) {
                new Thread(() -> {
                    try {
                        lock.lock();
                        System.out.println(Thread.currentThread().getName() + " wait for the signal");
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        lock.unlock();
                    }
                    System.out.println(Thread.currentThread().getName() + " receive the signal, go on ");
                }).start();
            }
            
    //        休眠5秒
            Thread.sleep(5000);
            
            new Thread(() -> {
                try {
    //                lock.lock();
                    System.out.println("signal all current lock's condition");
                    condition.signalAll();
                } finally {
                    lock.unlock();
                }
            }).start();
            
        }
        
        
    }

    Condition 的实现

    • Condition 接口的唯一实现类是同步器 AQS 的内部类 ConditionObject
    • 每个 Condition 对象都包含着一个 FIFO 队列,拥有首节点(firstWaiter)和尾节点(lastWaiter)
    • 队列中的每个节点都包含了一个在 Condition 对象上等待的线程引用
    • await() 方法相当于同步队列的首节点(已获取锁)移动到 Condition 的等待队列中
    • signal() 方法将会唤醒在等待队列中的节点,移到同步队列中

    实现原理可参考:https://blog.csdn.net/qq_38293564/article/details/80554516


    原文链接
     


     

    所有资源资源汇总于公众号



     

  • 相关阅读:
    DownloadManager
    Android(蓝牙)
    Android下集成Paypal支付
    java 网络(socket)
    java 泛型的几点备忘
    设计模式(模板方法)
    STM32F4_引领入门
    如何查找STM32开发资料
    Keil(MDK-ARM)使用教程(三)_在线调试
    Keil(MDK-ARM)使用教程(二)_菜单
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/12020578.html
Copyright © 2011-2022 走看看