Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';无接触异常';从线程的队列中获取时_Java_Multithreading_Thread Safety_Java Threads - Fatal编程技术网

Java';无接触异常';从线程的队列中获取时

Java';无接触异常';从线程的队列中获取时,java,multithreading,thread-safety,java-threads,Java,Multithreading,Thread Safety,Java Threads,从队列中删除时,有时会出现NoTouchElementException。我需要使用锁/等待/其他延迟机制吗 我提供了代码的粗略翻译 带队列的线程 public void run(){ while(true){ if(queue.size()>=2){ a = queue.remove(); b = queue.remove(); //DoesSomeWorkHereWhichWorks //Writes to MVAR's

从队列中删除时,有时会出现
NoTouchElementException
。我需要使用锁/等待/其他延迟机制吗

我提供了代码的粗略翻译

带队列的线程

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++
这样的简单语句

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


您可以找到更多。

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

if(queue.size()>=2)
    a = queue.remove();
    b = queue.remove();
等于写作:

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

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

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


如果有多个线程执行此操作,则无法保证在调用queue.remove()时queue.size()>0。有五个“writer”线程和一个“thread with queue”。所以这不应该是好的,因为队列线程每次只运行一次。这将是生成SSCCE的好时机。您可以查看
阻塞队列
,其
put(E)
take()
方法将阻塞,直到有空间/容量添加/删除元素。然后不需要检查大小,因为它将删除一个元素(或等到有一个要删除),然后删除第二个元素(或等到有一个要删除)。除非您确实需要等到有2个或更多线程时才能删除任何内容…但您没有真正说明程序的用途。如果有多个线程执行此操作,则无法保证在调用queue.remove()时queue.size()>0。有五个“writer”线程和一个“thread with queue”。所以这不应该是好的,因为队列线程每次只运行一次。这将是生成SSCCE的好时机。您可以查看
阻塞队列
,其
put(E)
take()
方法将阻塞,直到有空间/容量添加/删除元素。然后不需要检查大小,因为它将删除一个元素(或等到有一个要删除),然后删除第二个元素(或等到有一个要删除)。除非你真的需要等到有2个或更多个才删除任何东西…但是你没有真正说出程序的目的。哎哟,对不起,我已经更正了,我的代码是大括号。哎哟,对不起,我已经更正了,我的代码是大括号。