什么是保护性暂停?
保护性暂停(Guarded Suspension)是一种常见的线程同步设计模式,常用于解决 生产者-消费者问题 或其他需要等待条件满足后再继续执行的场景。通过这种模式,一个线程在执行过程中会检查某个条件是否满足,如果不满足,就进入等待状态,直到另一个线程通知条件已满足。
无非就是有点类似一个空盘子,一个消费者和生产者场景有点类似。有就唤醒消费者消费,没有消费者就等待。
1、正常示例:
public class test2 {
public static void main(String[] args) {
GuardeObject guardeObject = new GuardeObject();
new Thread(() -> {
Object o = guardeObject.get();
}).start();
new Thread(() -> {
guardeObject.comolete(Arrays.asList(1,2,3));
}).start();
}
}
class GuardeObject{
private Object response;
// 获取结果
public Object get() {
synchronized (this) {
while (response == null) {
try {
System.out.println("response == null");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("输出结果");
return response;
}
}
// 产生结果
public void comolete(Object response) {
synchronized (this) {
this.response = response;
try {
System.out.println("产生结果");
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
}
}
}
2、保护性暂停超时返回示例
// 获取结果
public Object get(long timeout) {
synchronized (this) {
long begin = System.currentTimeMillis();
long passTime = 0;
while (response == null) {
long waitTime = timeout - passTime;
if (waitTime <= 0) break;
try {
System.out.println("response == null");
this.wait(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
passTime = System.currentTimeMillis() - begin;
System.out.println("输出结果");
return response;
}
}
3、join源码:
4、总结
保护性暂停的超时等待应用于 join()方法中,可用于超时返回结果。保护性暂停的核心:在于等待线程在某个条件不满足时进入等待状态,并通过其他线程的通知机制在条件满足时继续执行