Java并发(二十三)—-同步模式之保护性暂停

1、定义

即 Guarded Suspension,用在一个线程等待另一个线程的执行结果

要点

  • 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject

  • 如果有结果不断从一个线程到另一个线程那么可以使用消息队列

  • JDK 中,join 的实现、Future 的实现,采用的就是此模式

  • 因为要等待另一方的结果,因此归类到同步模式

Java并发(二十三)----同步模式之保护性暂停

2、实现

class GuardedObject { ​     // 结果     private Object response;     private final Object lock = new Object(); ​     // 获取结果     public Object get() {         synchronized (lock) {             // 条件不满足则等待             while (response == null) {                 try {                     lock.wait();                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }             return response;         }     } ​     // 产生结果     public void complete(Object response) {         synchronized (lock) {             // 条件满足,通知等待线程             this.response = response;             lock.notifyAll();         }     } }

3、应用

一个线程等待另一个线程的执行结果

public static void main(String[] args) {     GuardedObject guardedObject = new GuardedObject();     new Thread(() -> {         try {             // 子线程执行下载             List<String> response = download(); // 模拟下载操作             log.debug("download complete...");             guardedObject.complete(response);         } catch (IOException e) {             e.printStackTrace();         }     }).start(); ​     log.debug("waiting...");     // 主线程阻塞等待     Object response = guardedObject.get();     log.debug("get response: [{}] lines", ((List<String>) response).size()); ​ }

执行结果

08:42:18.568 [main] c.TestGuardedObject - waiting... 08:42:23.312 [Thread-0] c.TestGuardedObject - download complete... 08:42:23.312 [main] c.TestGuardedObject - get response: [3] lines

4、带超时版 GuardedObject

如果要控制超时时间呢

class GuardedObjectV2 { ​     private Object response;     private final Object lock = new Object(); ​     public Object get(long millis) {         synchronized (lock) {             // 1) 记录最初时间             long begin = Syste