繁体   English   中英

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

[英]How to implement blocking request-reply using Java concurrency primitives?

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM