public final class GuardedObject<T> {
private String obj;
private final Lock lock = new ReentrantLock();
private final Condition done = lock.newCondition();
private static final int TIMEOUT = 1;
public String get(Predicate<String> p) {
lock.lock();
try {
while (!p.test(obj)) {
done.await(TIMEOUT, TimeUnit.SECONDS);
}
} catch (InterruptedException e) {
throw new RuntimeException();
} finally {
lock.unlock();
}
return obj;
}
public void onChanged(String obj) {
lock.lock();
try {
this.obj = obj;
done.signalAll();
} finally {
lock.unlock();
}
}
}
/**
* 服务 A 发送请求给服务 B,然后等待请求返回
*/
public final class Sender {
public void send() {
String req = "request";
System.out.println("Service A send request to service B: " + req);
GuardedObject go = new GuardedObject<>();
go.get(Objects::nonNull);
}
}
/**
* 服务 A 另外一个线程收到服务 B 的返回后,把结果反映到 GuardedObject
*/
public final class Receiver {
public void handle(String resp) {
GuardedObject go = ???
go.onChanged(resp);
}
}