假设有些线程要满足某些条件才能继续执行下去,比如要先等待某些其他的线程执行完某些逻辑才能继续,这时候就可使用Condition的await方法,让该线程进入阻塞状态,然后等其他线程处理完该线程需要的前置条件后,在通过signal()方法或signalAll()方法,然后等待着这个条件的线程就会被JVM唤醒,愉快的继续自己的逻辑了。
简单的实例代码:
public class SpringbootApplication {
private ReentrantLock reentrantLock = new ReentrantLock();
private Condition condition = reentrantLock.newCondition();
private volatile boolean flag = false;
public void A() {
reentrantLock.lock();
try {
if (flag == false) {
System.out.println("flag条件不满足,等待");
//条件不满足,阻塞
condition.await();
}
if (flag == true) {
System.out.println("flag条件满足了,开始做业务");
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
}
public void B() {
reentrantLock.lock();
try {
//假设修改条件的业务要执行5秒
TimeUnit.SECONDS.sleep(5);
flag = true;
System.out.println("修改flag条件,唤醒阻塞线程");
//唤醒阻塞线程
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
reentrantLock.unlock();
}
}
public static void main(String[] args) throws Exception {
SpringbootApplication conditionDemo = new SpringbootApplication();
new Thread(new Runnable() {
@Override
public void run() {
conditionDemo.B();
}
}).start();
conditionDemo.A();
}
}
运行结果如下:
从运行结果可以看到,flag改为true后,就唤醒等待该条件的线程,这个线程就能够继续执行业务逻辑了。
总结
当线程需要等待某种条件才能继续运行时,可以使用Condition接口来实现这个功能。