BlockingQueue:把()并为空()不一起工作?
-
19-08-2019 - |
题
我想有一个 SynchronousQueue
我在那里插入元素从一个线程 put()
, ,所以输入被阻止,直到的元素是采取在另一线。
在其他线进行大量的计算和时要检查,如果一个元件是已经提供,并使用它。但似乎 isEmpty()
总是返回真正的,即使另一个线是等待 put()
呼叫。
如何在地球上,这可能吗?这是样品代号:
@Test
public void testQueue() throws InterruptedException {
final BlockingQueue<Integer> queue = new SynchronousQueue<Integer>();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (!queue.isEmpty()) {
try {
queue.take();
System.out.println("taken!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do useful computations here (busy wait)
}
}
});
t.start();
queue.put(1234);
// this point is never reached!
System.out.println("hello");
}
编辑: 既不是为空()也不peek()工作,一个有用的投票().谢谢!
解决方案
从 http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/SynchronousQueue.html#put(E):
<强>的isEmpty 强>结果 公共布尔的isEmpty()点击 总是返回true。的SynchronousQueue没有内部容量。
(还没有研究这个很详细,但你可能想看看在任的调查的或需要的代替)
其他提示
除了蒂姆的答案-你是做什么的在线消费者,但不断地呼吁为空()在紧张的循环。而不是要求操作系统无法运行,直到有一些有用的东西为它做的,消费者线是连续地繁忙。即使为空正常工作、生产线会很少得到一个机会来运行。
你可能(如果为空()没有工作,或者你换到使用调查())使消费者睡一位测试之间的时的队列是空的,得到生产商有机会运行,或(最好)只采取了为空()测试,让在线的框在互斥内采取()在一个合理的方式而不是投票。
你的代码看起来像你正在尝试做的一项民意调查。为什么不只是调用poll()方法
不隶属于 StackOverflow