【问题标题】:JAVA - Concurrency - multi-producer/multi-consumer request and response queueJAVA - 并发 - 多生产者/多消费者请求和响应队列
【发布时间】:2017-05-09 04:01:21
【问题描述】:

我有 3 种类型的线程。主线程,工作者,客户端。 我也有 2 个队列,一个请求队列和一个响应队列。

主线程产生许多客户端。每个客户端都会请求一些东西,并且应该将其添加到主请求队列中。主程序将产生适当的工作人员,工作人员将处理请求。完成后,它会将 [result, calling thread #] 添加到响应队列中。每个客户端都会在请求后等待响应。我该怎么办?

我想我应该为队列使用并发链接队列。这个可以吗? 客户端是否应该偷看直到找到它的线程 ID 和轮询?头部是否有可能在窥视和轮询之间改变?我不想添加锁,因为会有很多争用和延迟。

这必须是线程安全和并发的,并且没有任何死锁或饥饿。

【问题讨论】:

  • 您可能想提交一个minimal reproducible example。总是很难回答仅仅在广泛、不具体的层面上解释你的代码在做什么的问题。除此之外:您在这里问的问题不止一个。请退后一步,让您的问题更具体;如果有几个不同的问题要问 - 问几个不同的问题!

标签: java multithreading concurrency


【解决方案1】:

我将有一个请求队列,然后为每个客户端创建一个单独的响应队列。作为发送给工作人员的请求的一部分,我会引用客户端的响应队列,这样客户端就不必通过单个响应队列连续peak()

对请求和响应队列都使用BlockingQueues。在请求队列上放置更高的容量(即大于客户端线程的数量)以消除饥饿。响应队列的容量可以只有一个。使用put()take() 而不是peak()poll()

顺序如下:

  1. 客户端创建请求。

  2. 客户端将其放入请求队列中,如果队列已满则阻塞。 (这就是你提高请求队列容量的原因。)

  3. 客户端在它自己的响应队列上调用take()并阻塞,因为它是空的。

  4. 工作线程产生,或已经产生并在空请求队列上阻塞。

  5. 工作线程从请求队列中移除项目并对其进行处理。完成后,它会将其放入客户端的响应队列中(使用对请求中传递的响应队列的引用。)

  6. 这会导致客户端解除阻止。客户端从其响应队列中移除响应并对其进行处理。

【讨论】:

  • 通过文本回答问题,其中大多数句子以“?”结尾可能不是正确的方法换句话说:您主要是要求澄清。这不是一个有效的答案!
  • 对不起,我知道。我会把它放在评论中,但我还没有 50 分。
  • 我对 OP 发表了评论。并且:你需要50分评论的系统是故意的。因为您故意不应该使用答案来绕过此限制。请删除您的答案...否则只会造成更多的流失。
  • 我得到澄清后更新我的答案怎么样。我已经准确地实现了这个家伙可能要问的 20 次。
  • 我不会屏住呼吸。并且:如果您等待更改,则将此问题标记为“收藏”。你看,其他人会看着你的答案。可能会有反对票,更重要的是:您的答案会出现在审核队列中。这意味着其他人开始浪费时间审查它。如果你想等待问题得到改善......很好 - 但在等待时不要保留 bad 答案。
猜你喜欢
  • 1970-01-01
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多