我有一个要处理的带有对象的LinkedList。对象是从另一个线程添加到其中的,但是只有一个线程从中删除/读取了该对象。
private LinkedList<MyObject> queue = new LinkedList<>();
new Thread()
{
@Override
public void run()
{
while (!Thread.interrupted())
{
if (!queue.isEmpty())
{
MyObject first = queue.removeFirst();
// do sth..
}
}
}
}.start();
在另一个线程中,我将对象添加到队列中
queue.add(new MyObject());
有时,这段代码会导致Exception,我无法真正向自己解释。
线程“”中的异常java.util.NoSuchElementException
在java.util.LinkedList.removeFirst(LinkedList.java:270)
我不明白,为什么会得到此异常,因为它仅应尝试删除一个存在的对象。
最佳答案
正如Nicolas已经提到的那样,您需要一个线程安全的实现。我建议使用LinkedBlockingQueue
。
您可以使用offer
方法添加到它,并使用take
删除它,这也可以解决您的“忙碌等待”问题。
关于java - 线程安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39976466/