我想有一个 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()方法

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top