基于白嫖黑马程序员白嫖视频:全面深入学习java并发编程,java基础进阶中级必会教程
1 场景
适用于两个线程有强的顺序逻辑,虽然可以并行,但是必须要等到某一个完成,另个才可以完成。
2 代码
要求t2先输出,然后t1才能输出。
public class Main {
static ReentrantLock lock = new ReentrantLock();
static Condition condition = lock.newCondition();
static boolean t2Run = false;
public static void main(String[] args) {
//要求一定是线程2先执行
//线程1
new Thread(() -> {
try {
lock.lock();
while (!t2Run) {//t2没有执行完,一直等待
try {
condition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//t2执行完了
System.out.println("t1输出");
} finally {
lock.unlock();
}
}).start();
//线程2
new Thread(() -> {
try {
lock.lock();
System.out.println("t2执行完毕");
t2Run = true;
condition.signalAll();
} finally {
lock.unlock();
}
}).start();
}
}
3 总结
是保护性暂停的一种使用,使用等待通知机制,维护一个boolean的变量来传递信息,本来可以直接使用await,再加一层boolean的目的是防止错误通知。