2017-05-09 99 views
0

我有3种类型的线程。主线程,工作者,客户端。 我也有2个队列,一个请求和一个响应队列。JAVA - 并发 - 多生产者/多消费者请求和响应队列

主线程产生许多客户端。每个客户端都会请求一些内容并将其添加到主要请求队列中。主要产生适当的工人,工人将处理请求。完成后,它将[结果,调用线程#]添加到响应队列中。每个客户都会在请求后等待回应。我应该怎么做呢?

即时思考我应该使用concurent链接队列的队列。这个可以吗?客户应该偷看直到它找到它的线程ID和轮询?头部在偷看和民意调查之间改变是否可行?我不想加锁,因为会有很多争用和延误。

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

+2

你可能想搭起一个[mcve]。总是很难回答那些仅仅解释你的代码在做什么的问题,在广泛的,非特定的层面上。除此之外:你在这里问的问题不止一个。请退后一步,让您的问题更具体;如果有几个不同的问题需要问 - 请问几个不同的问题! – GhostCat

回答

0

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

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

这里的顺序:

  1. 客户端创建的请求。

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

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

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

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

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

+0

通过文本回答问题,大多数句子以“?”结尾也许是正确的方法换句话说:你主要是要求澄清。这不能构成一个有效的答案! – GhostCat

+0

对不起,我知道。我会把它置于评论中,但我还没有50分。 –

+0

我对OP发表了评论。并且:你需要50分评论的系统是有意的。因为它的目的是不应该使用回答来绕过这个限制。请删除你的答案,否则它只会造成更多的流失。 – GhostCat

相关问题