我的系统包含一个“代理”类,它接收“请求”数据包,对它们进行编组并通过网络将它们发送到服务器,服务器解组它们,处理并返回一些“响应数据包”。
代理端的“提交”方法应该阻止,直到收到请求的回复(数据包有ID用于标识和引用目的)或者直到达到超时为止。
如果我是在早期版本的Java中构建这个,我可能会在我的代理中实现一个“待处理消息ID”的集合,我将在其中提交消息,并在相应的id上使用wait()(具有超时) 。收到回复后,处理线程会通知()相应的id。
有没有更好的方法来使用现有的库类来实现这一点,可能是在java.util.concurrency中?
如果我使用上述解决方案,在调用wait()之前处理回复的潜在竞争条件的正确方法是什么?
答案 0 :(得分:8)
简单的方法是让Callable与服务器通信并返回响应。
// does not block
Future<Response> response = executorService.submit(makeCallable(request));
// wait for the result (blocks)
Response r = response.get();
管理请求队列,为请求分配线程以及通知客户端代码都被实用程序类隐藏起来。
并发级别由执行程序服务控制。 每个网络调用都阻塞一个线程。
为了更好的并发性,人们也可以考虑使用java.nio(但是因为你正在与所有请求的同一服务器通话,所以并发连接数固定,甚至只有一个,似乎就足够了。)