如何确保Java在某些代码块中不会切换线程?



>我有 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(。

最新更新