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

标签 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

    }

}

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

最佳答案

如果您的代码片段没问题,则存在问题,因为:

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

等于写:

if(queue.size()>=2) {
    a = queue.remove();
}
    b = queue.remove();
<小时/>

关于你的问题,当你有多个线程时,你应该考虑到每条Java语句都会分解为多个子语句,即使是像i++这样的简单语句。

来自不同线程的子语句可能在程序执行期间交错,如果线程之间存在共享资源(例如您的队列),结果可能是不可预测的。

您可以找到更多here .

关于从线程的队列中获取时出现 Java 'NoSuchElementException',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35635647/

相关文章:

java - Jsch - 执行 Shell 脚本后退出

java - 如何解决无法从静态上下文引用非静态方法的问题?

c# - 线程间通信不杀线程

java - 如何在静态同步块(synchronized block)内进行线程间通信

c# - BinaryFormatter 序列化和反序列化线程安全吗?

java - "AWT-EventQueue-0"java.lang 中的 NullPointerException

Java在Mac上运行缓慢

java - Java中的中断线程

c - 我需要内存屏障吗?

c# - 是否可以从另一个线程观察部分构造的对象?