同步模式之保护性暂停
即 Guarded Suspension,用在一个线程等待另一个线程的执行结果
要点
- 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject
- 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
- JDK 中,join 的实现、Future 的实现,采用的就是此模式
- 因为要等待另一方的结果,因此归类到同步模式
实现
classGuardedObject {
privateObjectresponse;
privatefinalObjectlock=newObject();
publicObjectget() {
synchronized (lock) {// 条件不满足则等待
while (response==null) {
try {lock.wait();
} catch (InterruptedExceptione{
e.printStackTrace();
}
}
returnresponse;
}
}
public void complete(Objectresponse) {
synchronized (lock) {// 条件满足,通知等待线程
this.response=response;
lock.notifyAll();
}
}
}
应用
一个线程等待另一个线程的执行结果
public static void main(String[] args) {
GuardedObject guardedObject=newGuardedObject();
newThread(() -> {
try {// 子线程执行下载
List<String>response=download();
log.debug("downloadcomplete...");
guardedObject.complete(response);
} catch (IOExceptione) {
e.printStackTrace();
}
}
).start();
log.debug("waiting..."); // 主线程阻塞等待
Objectresponse=guardedObject.get();
log.debug("get response: [{}] lines", ((List<String>)
response).size());
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20210319114714314.png)