JAVA - 并发 - 多生产者/多消费者请求和响应队列

时间:2017-05-09 04:01:22

标签: java multithreading concurrency

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

主线程产生了许多客户端。每个客户端都会请求一些内容,并且应该将其添加到主要的请求队列中。 main将生成相应的worker,worker将处理请求。完成后,它会将[result,calling thread#]添加到响应队列中。每个客户端将在请求之后等待响应。我该怎么办呢?

我认为我应该为队列使用concurent链接队列。这个可以吗? 客户端是否应该查看它的线程ID和轮询?是否有可能头部在偷看和民意调查之间发生变化?我不想添加锁,因为会有很多争用和延迟。

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

1 个答案:

答案 0 :(得分:0)

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

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

以下是序列:

  1. 客户端创建请求。

  2. 客户端将其放在请求队列中,并在队列已满时阻止。 (这就是为什么你要求请求队列的容量更高。)

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

  4. 工作线程产生,或者已在空请求队列中生成并阻止。

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

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