>我有 6 个线程访问一个公共队列容器,他们的 run(( 方法中有这个:
if (queue.size() != 0) {
Element e = queue.remove();
//code
它几乎每次都按预期工作,但是,偶尔线程仅在 if check 和 remove(( 方法之间切换,因此其他线程获取元素,而该线程获取 NoSuchElementException。如何确保这两行代码线程之间不会切换?
两个主要选项是:
- 使这两个语句原子化,例如通过使用
synchronized
块 - 使用并发集合。
在您的情况下,您可以使用具有多种方法可以解决您的问题的BlockingQueue
(请参阅 javadoc 中的表格(。 根据您提供的信息,BlockinQueue::take
似乎是一个很好的候选人。
假设它是一个BlockingQueue(它应该是正确的线程安全的(,你可能应该使用poll(long,TimeUnit(。这应该原子地检查队列中是否有时间段内的元素,如果有,则返回它(如果没有,则返回null
(。