欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA Condition

程序员文章站 2024-02-17 22:24:34
...

等待通知机制,在Java中主要有两种方式:

  • 一是基于wait/notify方法结合synchronized关键字来实现
  • 二是Condition结合Lock来实现

Condition的示例:
Condition接口定义了等待/通知两种类型的方法,在线程调用这些方法时,需要提前获取Condition对象关联的锁(在基于wait/notify方法实现的方案中需要获取的是对象锁)。

Condition对象是需要关联Lock对象的,调用Lock对象的newCondition()对象创建而来,也就是说Condition的使用是需要依赖Lock对象的。

    private Lock lock = new ReentrantLock();

    private Condition condition = lock.newCondition();
 
    public void conditionAwait() throws InterruptedException {
        lock.lock();
        try {
            condition.await();
        } finally {
            lock.unlock();
        }
    }
 
    public void conditionSignal() {
        lock.lock();
        try {
            condition.signal();//condition.signalAll();
        } finally {
            lock.unlock();
        }
    }

常用的方法:
await():当前线程进入等待状态直到被通知(signal)或中断;

当前线程进入运行状态并从await()方法返回的场景包括:
(1)其他线程调用相同Condition对象的signal/signalAll方法,并且当前线程被唤醒;
(2)其他线程调用interrupt方法中断当前线程;

signal():
唤醒一个等待在Condition上的线程,被唤醒的线程在方法返回前必须获得与Condition对象关联的锁

Condition-线程通信更高效的方式

借助于Condition对象,RetrantLock可以实现类似于Object的wait和notify/notifyAll功能。使用它具有更好的灵活性。
在一个Lock对象里面可以创建多个Condition(对象监视器)实例,线程对象可以注册在指定的Condition对象中,从而可以有选择性的进行线程通知,实现多路通知功能,在调度线程上更加灵活。

见上一篇中的ArrayBlockingQueue<E>