【问题标题】:How to make sure Java won't switch threads when in certain block of code?如何确保Java在某些代码块中不会切换线程?
【发布时间】:2018-01-11 06:23:00
【问题描述】:

我有 6 个线程访问一个公共队列容器,它们在他们的 run() 方法中有这个:

if (queue.size() != 0) {
    Element e = queue.remove();
    //code

它几乎每次都按预期工作,但是,有时线程会在 if check 和 remove() 方法之间切换,因此其他一些线程获取元素并且该线程获取 NoSuchElementException。我如何确保这两行代码之间的线程不会切换?

【问题讨论】:

标签: java multithreading


【解决方案1】:

两个主要选项是:

  • 使这两个语句原子化,例如使用synchronized
  • 使用并发集合。

在您的情况下,您可以使用a BlockingQueue,它有多种方法可以解决您的问题(请参阅 javadoc 中的表格)。根据您提供的信息,BlockinQueue::take 似乎是一个不错的候选人。

【讨论】:

    【解决方案2】:

    假设它是一个BlockingQueue(它应该是适当的线程安全的),您可能应该使用poll(long,TimeUnit)。这应该自动检查队列中是否有一个元素在时间段内,如果有则返回它(如果没有,则返回null)。

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 2012-05-03
      • 2012-04-28
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多