2016-02-25 88 views
0

从队列中删除时,我得到的是NoSuchElementException有时是。我是否需要使用锁/等待/其他延迟机制?当从队列中抽取队列时发生Java'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

如果您有多个线程正在执行此操作,则无法保证在调用queue.remove()时queue.size()> 0。 –

+1

有五个'作家'线程和一个'带队列的线程'。所以不应该这样,因为队列线程每次只能运行一次。 –

+0

这将是制作SSCCE的好时机。 http://sscce.org/ –

回答

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

+0

哎呦对不起,我已经纠正它,我的代码卷曲支撑。 –