2010-09-15 53 views
1

我有以下代碼,只有當它至少有2個元素時,才從隊列中檢索第一個元素。出於某種原因,它不是輪詢第一個元素。但是,如果我在其中添加打印語句,它將打印並輪詢。該方法在一個線程中,並且還有另一個線程將元素添加到隊列中,此線程將從隊列中讀取。隊列不能使用線程?

... 
public void run(){ 
    while(beginning){ 
     int size = queue.size(); 
     // adding this will cause the program to enter if below: System.out.println(size); 
     if(size > 1){ 
      System.out.println("data: " + queue.poll()); 
      beginning = false; 
     } 
    } 
} 
... 

如果添加的println語句,將打印
....
數據:數據

如果println語句,是刪除,也不會打印什麼。

其實,只要我把東西在裏面,一個Thread.sleep代碼(1)或隨機打印語句,它會查詢出的數據並打印

thanx的任何輸入。

+0

[Loop沒有看到沒有打印語句的更改值]的可能重複(http://stackoverflow.com/questions/25425130/loop-doesnt-see-changed-value-without-a-print-statement) – Boann 2014-08-25 15:52:10

回答

1

您需要的隊列對象上進行同步:

public void run(){ 
    while(beginning){ 
     synchronized (queue) { 
      int size = queue.size(); 
      // adding this will cause the program to enter if below: System.out.println(size); 
      if(size > 1){ 
       System.out.println("data: " + queue.poll()); 
       beginning = false; 
      } 
     } 
    } 
} 

這會防止你的多線程在不適當的時間訪問隊列。

您還必須以類似的方式將正在將項目添加到隊列中的線程同步。

0

它看起來像一個同步問題。

0

你應該小心使用線程間的共享資源。您應該考慮使用鎖(令牌),在訪問隊列並在使用後釋放它之前獲取它。

0

......事實證明,我必須在線程上進行同步才能使其工作,因爲隊列是由鏈表實現的。

但是,爲什麼打印聲明使它工作?