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>
上一篇: js获取链接中的参数
下一篇: JS函数获取url参数