gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:10 28 4
gpt4 key购买 nike

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

我在代理端的“提交”方法应该阻塞,直到收到对请求的回复(数据包具有用于识别和引用目的的 ID)或直到达到超时。

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

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

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

最佳答案

简单的方法是使用一个与服务器对话并返回响应的 Callable。

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

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

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

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

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

关于java - 如何使用 Java 并发原语实现阻塞请求-回复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2564760/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com