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