我正在使用观察者模式和BlockingQueue添加一些实例。现在,在另一种方法中,我正在使用队列,但是即使我这样做,似乎take()一直在等待: 通用标签

而mDiffQueue是一个LinkedBlockingQueue,我这样使用它: 通用标签

但是我认为检查了第一个表达式,而mDone不是true,那么mDone可能设置为true(观察者始终是多线程的?),但是它已经在调用mDiffQueue.take()了? :-/

编辑:我现在真的不明白。我最近将其更改为: 通用标签

如果我在调试器中稍等片刻,它将起作用,但由于mDone初始化为false,因此它也应“实时”运行,因此while条件应为true,并且主体应被执行。

如果mDiffQueue为空且mDone为true,则应跳过while循环的主体(这意味着不再填充队列)。

编辑:似乎是: 通用标签

即使我不明白为什么peek()是强制性的。

编辑:

我正在做的是遍历一棵树,我想跳过所有插入的节点: 通用标签

基本计算树中的最大深度或级别,而不考虑在树的另一个修订版中删除的节点(用于比较Sunburst可视化),但是好的,这可能超出范围。只是为了说明我正在对尚未插入的节点进行操作,即使它只是在调整最大深度。

致谢

约翰内斯

有帮助吗?

解决方案

第一条建议:不要生成种族标记标签。如果LinkedBlockingQueue有一些synchronized (mDiffQueue)方法,您将陷入僵局。这里不是这种情况,但是您应该避免这种做法。无论如何,我不明白您为什么要在此时进行同步。

在等待检查是否已设置synchronized时,您必须定期“唤醒”: 通用标签

这与使用mDone大致相同,但是peek基本上等待一纳秒。使用peek称为“忙等待”(您的线程不间断地运行while循环),使用peek称为“半忙等待”(您让线程间隔睡眠)。

我想在您的情况下,如果pool不是process(diff)类型的话,diff将会脱离循环。我不确定这是否是您要完成的任务。这似乎很奇怪,因为您基本上只是暂停使用者线程,直到获得正确类型的单个元素,然后再对其执行任何操作。而且,由于您不在while循环中,因此无法接收将来的传入元素。

其他提示

take()是一个“阻止呼叫”。这意味着它将阻塞(永远等待)直到队列中有某些东西,然后它将返回添加的内容。当然,如果队列中有东西,它将立即返回。

您可以使用peek()返回take()将返回的 -也就是说,peek()返回下一个项目而没有将其从队列中删除,或者返回null(如果有)队列中没有任何东西。尝试在测试中改用peek()(但也请检查是否为null)。

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