我不确定我是否正确理解了这个问题,但我通常将 aFuture<T>
用于这类任务。
在内部,Future<T>
实现使用等待和通知以及所有这些,但接口本身变得相当干净。
Future<Double> getTemperature(int id);
然后,在您的通信代码中,您可以将传入的消息映射到未完成的未来。如果保证订购,您可以执行类似的操作
class Something {
Map<Integer, Queue<Object>> requests;
synchronized Future<?> request(int id, Object data) {
MyFutureImpl future = new MyFuture();
requests.get(id).add(future);
serializeAndSend(id, data);
return future;
}
void serializeAndSend(id, data) {...}
synchronized void response(int id, Object data) {
MyFutureImpl future = requests.get(id).remove();
future.setValue(data); // This would fulfill the future, and any
// threads waiting in a get() will get the
// value and continue.
}
}
MyFutureImpl 是一个非常基本的未来实现。我假设有一个通信线程response()
在收到数据包时调用。我还假设serializeAndSend()
-function 处理对客户端的写入或阻塞,直到可以进行写入操作或将其移交给通信线程。
使用具有并发能力的映射和队列结构可以使一些synchronization
s 变得不必要。如果每个 id 只有一个未完成的呼叫,那么队列当然就变得不必要了。