如何使用Java并发原语实现阻塞请求 - 回复?

时间:2010-04-02 02:41:28

标签: java multithreading concurrency

我的系统包含一个“代理”类,它接收“请求”数据包,对它们进行编组并通过网络将它们发送到服务器,服务器解组它们,处理并返回一些“响应数据包”。

代理端的“提交”方法应该阻止,直到收到请求的回复(数据包有ID用于标识和引用目的)或者直到达到超时为止。

如果我是在早期版本的Java中构建这个,我可能会在我的代理中实现一个“待处理消息ID”的集合,我将在其中提交消息,并在相应的id上使用wait()(具有超时) 。收到回复后,处理线程会通知()相应的id。

有没有更好的方法来使用现有的库类来实现这一点,可能是在java.util.concurrency中?

如果我使用上述解决方案,在调用wait()之前处理回复的潜在竞争条件的正确方法是什么?

1 个答案:

答案 0 :(得分:8)

简单的方法是让Callable与服务器通信并返回响应。

 // does not block
 Future<Response> response = executorService.submit(makeCallable(request));

 // wait for the result (blocks)
 Response r = response.get();

管理请求队列,为请求分配线程以及通知客户端代码都被实用程序类隐藏起来。

并发级别由执行程序服务控制。 每个网络调用都阻塞一个线程。

为了更好的并发性,人们也可以考虑使用java.nio(但是因为你正在与所有请求的同一服务器通话,所以并发连接数固定,甚至只有一个,似乎就足够了。)