定义
即Guarded Suspension(保护性暂停),用在一个线程等待另一个线程的执行结果。
- 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject。
- 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)。
- JDK中,join的实现、Future的实现,采用的就是此模式。
- 因为要等待另一方的结果,因此归类到同步模式。
实现
通过GuardedObject对象作为中间对象,实现两个线程的同步。
public class GuardedSuspend {
public static void main(String[] args) {
GuardedObject guardedObject = new GuardedObject();
new Thread(() -> {
Object consumer = guardedObject.consumer();
System.out.println(consumer);
}, "t1").start();
new Thread(() -> {
guardedObject.produce("give you a bread");
}, "t2").start();
}
}
class GuardedObject {
private Object result;
public Object consumer() {
synchronized (this) {
// 避免虚假唤醒
while (Objects.isNull(result)) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return result;
}
public void produce(Object obj) {
synchronized (this) {
System.out.println("produce a result");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.result = obj;
this.notifyAll();
}
}
}
join的原理
join的实现就是使用同步模式之保护性暂停的设计模式,调用join方法的线程,实际上执行了wait方法,让外面的线程等待到调用join方法的线程对象上。
总结
同步模式之保护性暂停模式中生产者和消费者是一一对应关系的,生产线程生产产品,消费线程获取产品。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100296.html