如何知道SynchronousQueue是否轮询另一个线程?

时间:2018-12-16 13:07:35

标签: java asynchronous java.util.concurrent thread-synchronization

我的用例非常晦涩,但从本质上讲,我需要知道另一个线程是否执行SynchronousQueue poll(具有超时),并且它是否要插入项目并取消阻止它。

有没有简单的方法可以做到这一点?从我幼稚的javadoc和代码阅读代码看似没有,但我认为我会检查SOE。

2 个答案:

答案 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 ...可以帮助解除对消费者的封锁。