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个或更多个才删除任何东西…但是你没有真正说出程序的目的。哎哟,对不起,我已经更正了,我的代码是大括号。哎哟,对不起,我已经更正了,我的代码是大括号。