Condition 简单使用

类似于java中原来线程交互所用的wait,notify和notifyAll方法在新的并发包中基于重入锁机制引入了Condition接口, Condition 将 Object 监视器方法( wait 、 notify 和 notifyAll )分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set),就是多路等待。Condition 的方法与 wait 、notify 和 notifyAll 方法类似,分别命名为 await 、 signal和singalAll因为它们不能覆盖Object上的对应方法。

package com.liukai.concurrent.aqs.lock.condition;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * condition 测试
 *
 * @author liu kai
 * @date 2020-03-05 20:57
 */
public class ConditionTest01 {

    private static final Lock lock = new ReentrantLock();
    private static final Condition testCondition = lock.newCondition();

    public static void main(String[] args) {
        //测试开两个线程,线程A先工作一会,再等待。线程B唤醒 A
        ConditionTest01 conditionTest01 = new ConditionTest01();
        new Thread(() -> {
            conditionTest01.testWait();
        }).start();

        new Thread(() -> {
            conditionTest01.testSign();
        }).start();
    }


    private void testWait() {
        try {
            lock.lock();
            System.out.println("线程启动就休眠" + Thread.currentThread().getName());
            testCondition.await();
            System.out.println("线程被唤醒" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    private void testSign() {
        try {
            lock.lock();
            for (int i = 0; i < 100; i++) {
                Thread.sleep(10);
                System.out.println("线程" + Thread.currentThread().getName() + "工作中");
            }
            System.out.println("工作完成,唤醒等待的线程");
            testCondition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 那条老街还铺着青石板路。左右的一排房屋有100年以上历史了,屋顶还铺着片瓦,木制的窗棂、窄小的木栏杆阳台。临街...
    活得有趣阅读 440评论 0 5
  • 书名:《邻家的百万富翁》作者:[美] 托马斯·J. 斯坦利 / 威廉·D. 丹科金句:财富,是积累下来的东西,而不...
    精力满满阅读 202评论 0 0
  • 老板最喜欢什么样的人你知道吗?你是吗?你想吗? 如果你知道,那么你可以去看别的文章了。 如果你是,那么...
    糊小姐阅读 444评论 4 6
  • 视图控制器两种创建图层次结构:1.代码方式:覆盖UIViewController的loadView方法。2.文件方...
    水无月之痕阅读 665评论 0 0