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

时间:2017-08-03 14:51:31

标签: java multithreading

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

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

它几乎每次都按预期工作,但是,偶尔的线程只在if check和remove()方法之间切换,所以其他一些线程获取元素,这个线程获得NoSuchElementException。我如何确保这两行代码线程之间不会切换?

2 个答案:

答案 0 :(得分:3)

两个主要选项是:

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

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

答案 1 :(得分:0)

假设它是BlockingQueue(应该是正确的线程安全),你应该使用poll(long,TimeUnit)。这应该以原子方式检查队列中是否存在具有时间段的元素,如果存在,则返回它(如果没有,则返回null