2016-02-25 86 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

哎呦對不起,我已經糾正它,我的代碼捲曲支撐。 –