从线程中获取队列时的Java'NoSuchElementException'

时间:2016-02-25 18:43:36

标签: java multithreading thread-safety java-threads

从队列中删除时,我有时会获得NoSuchElementException 。我是否需要使用锁/等待/其他延迟机制?

我提供了代码的粗略翻译。

带队列的线程

public void run(){
while(true){
    if(queue.size()>=2){
        a = queue.remove();
        b = queue.remove();

    //DoesSomeWorkHereWhichWorks
    //Writes to MVAR's
    }
}

写入队列的线程

public void run(){
    while(x>0){
        //Does something which works
        QueueThread.add(this);

       //Take from mvars

    }

}

非常感谢,请放轻松我,我是编程的新手:)

1 个答案:

答案 0 :(得分:2)

如果您的代码段正常,则会出现问题,因为:

if(queue.size()>=2)
    a = queue.remove();
    b = queue.remove();

等于写作:

if(queue.size()>=2) {
    a = queue.remove();
}
    b = queue.remove();

关于你的问题,当你有多个线程时,你应该考虑到每个Java语句在多个子语句中被分解,甚至是像i++这样的简单语句。

来自不同线程的子语句可能在程序执行期间交错,如果线程之间存在共享资源(如queue),则结果可能无法预测。

您可以找到更多here