我有3种类型的线程。主线程,工人,客户端。 我还有2个队列,一个请求和一个响应队列。
主线程产生了许多客户端。每个客户端都会请求一些内容,并且应该将其添加到主要的请求队列中。 main将生成相应的worker,worker将处理请求。完成后,它会将[result,calling thread#]添加到响应队列中。每个客户端将在请求之后等待响应。我该怎么办呢?
我认为我应该为队列使用concurent链接队列。这个可以吗? 客户端是否应该查看它的线程ID和轮询?是否有可能头部在偷看和民意调查之间发生变化?我不想添加锁,因为会有很多争用和延迟。这必须是线程安全且并发的,并且没有任何死锁或饥饿。
答案 0 :(得分:0)
我会有一个请求队列,然后是每个客户端的单独响应队列。作为发送给worker的请求的一部分,我会引用客户端的响应队列,这样客户端就不必通过单个响应队列peak()
。
对请求和响应队列使用BlockingQueues
。在请求队列上放置更高的容量(即大于客户端线程的数量)以消除饥饿。响应队列的容量可以只有一个。使用put()
和take()
代替peak()
和poll()
。
以下是序列:
客户端创建请求。
客户端将其放在请求队列中,并在队列已满时阻止。 (这就是为什么你要求请求队列的容量更高。)
客户端在其自己的响应队列和块上调用take()
,因为它是空的。
工作线程产生,或者已在空请求队列中生成并阻止。
工作线程从请求队列中删除该项并对其进行处理。完成后,它会将其放在客户端的响应队列中(使用对请求中传递的响应队列的引用。)
这会导致客户端解除阻止。客户端从响应队列中删除响应并对其进行处理。