好吧,正如评论所暗示的那样:最好不要自己尝试实现这一点。但是,基本上您可以使用带有 wait()/notify() 的标准 Java 线程同步
- Thread-1 组对 Thread-2 的远程调用以及唯一的 call-ID。
- Thread-1 现在
wait()
在同步对象上(而不是sleep()
)
- Thread-2 完成工作并返回结果,它调用 JVM 中的一些远程回调方法 Thread-1 驻留在其中 - call-ID 与结果一起传递
- Thread-1 端的回调方法通过 call-ID 使结果可用,并通过以下方式唤醒所有等待的线程
notifyAll()
- 线程包括。Thread-1 检查他们的结果是否到达,如果是,他们继续工作,如果没有,则
wait()
再次。
Thread-1 端的伪代码:
HashMap<String, Object> results;
// Called by Thread-1 to access Thread-2
public void doIt() {
String callId = "aUniqueCallId";
Object result = null;
remoteCallToThread2(callId);
synchronized(results) {
while((result = results.remove(callId)) == null) {
results.wait();
}
}
doSomethingWith(result);
}
// Called remotely by Thread-2 when result is available
public void callback(String callId, Object result) {
synchronized(results) {
results.put(callId, result);
results.notifyAll();
}
}
当然这只是基本思路,不能这样用,这里要考虑的东西很多。