java - 随机 java.util.NoSuchElementException 即使使用 wait()

标签 java multithreading linked-list wait

你能告诉我在什么情况下这段代码会抛出 java.util.NoSuchElementException 吗:

public class StackTest {

    private LinkedList<Object> myList = new LinkedList<Object>();
    public StackTest() {

        Thread testStack = new Thread() {
            @Override
            public void run() {
                while (true)
                { 
                    synchronized (myList)
                    {
                        try {
                            if (myList.size() == 0)
                            {
                                myList.wait();
                            }
                            Object elem = myList.removeLast();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        testStack.start();
    }

    public void enQueue(Object o)
    {
        synchronized(myList)
        {
            myList.addFirst(o);
            myList.notifyAll();
        }
    }
}

我的循环总是在等待 enqueue 方法在添加元素后调用 notifyAll。但有时,我在调用 myList.removeLast()

时会出现 java.util.NoSuchElementException

最佳答案

你应该坚持 the recommended pattern并将您的条件放在 while 中以避免虚假唤醒。

synchronized (myList) {
    try {
        while (myList.size() == 0) {
            myList.wait();
        }
        Object elem = myList.removeLast();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

关于java - 随机 java.util.NoSuchElementException 即使使用 wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44258805/

相关文章:

c++ - 如何从线程中取回数据?

c - 多个独立的线程处理程序

java - 如何安全发布StringBuffer?

c - C 中的链表和函数

java - 如何从对象的 LinkedList 以及所有这些对象的 LinkedList 中删除对象?

java - 从行中删除双引号

java - JPA:如何设置 MySQL session 变量?

java - 尽管请求中存在 Accept-Encoding header ,但 POST 响应未压缩

java - Graphics2D - 文本在缩放坐标空间中很大

c++ - 自调整列表和常规链表之间的主要区别