我的用例非常晦涩,但从本质上讲,我需要知道另一个线程是否执行SynchronousQueue poll
(具有超时),并且它是否要插入项目并取消阻止它。
有没有简单的方法可以做到这一点?从我幼稚的javadoc和代码阅读代码看似没有,但我认为我会检查SOE。
答案 0 :(得分:0)
如果您实现了此逻辑,并且生产者线程每次发现poll
上有另一个线程被阻塞,则生产者线程将值添加到队列中-这可以保证生产者放入队列的值将被该线程而不是另一个线程?
建议更改您的设计。生产者(向队列添加值的线程)对消费者一无所知。使您产生一个请求消费者。我的意思是定义另一个队列,并使使poll
的当前线程提交request
。您当前的生产者线程从该新队列中获取请求并完成请求。您可以在两个线程之间实现请求对象作为 mediator 的方式。
答案 1 :(得分:0)
因此,在经过许多解决方案(自定义队列,单独的volatile变量以跟踪插入)之后,使用offer
方法最终得出了非常简单的解决方案:
/**
* Inserts the specified element into this queue, if another thread is
* waiting to receive it.
*
* @param e the element to add
* @return {@code true} if the element was added to this queue, else
* {@code false}
* @throws NullPointerException if the specified element is null
*/
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
return transferer.transfer(e, true, 0) != null;
}
如果我只做if(offer(e)) ... else ...
可以帮助解除对消费者的封锁。