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 的实现
实现原理可参考:https://blog.csdn.net/qq_38293564/article/details/80554516
ConstXiong 备案号:苏ICP备16009629号-3