2012-09-07 17 views
0

我只是在Java中學習一些線程,我想知道是否有人能幫助我。試圖找出線程和Java

我創建了10個整數的列表。我想要做的是有多個線程進入,獲取索引爲0的整數,打印並移除它。我希望這種情況發生,直到列表中沒有更多數字。這是我的代碼到目前爲止。

public class SlothTest implements Runnable{ 

static ArrayList<Object> test = new ArrayList<>(); 
static int listSize; 

public static void main(String[] args) { 

    for (int i = 0; i < 10; i++){ 
     test.add(i); 
    } 

    SlothTest runner = new SlothTest(); 
    Thread alpha = new Thread(runner); 
    Thread beta = new Thread(runner); 
    alpha.setName("Alpha thread"); 
    beta.setName("Beta thread"); 
    alpha.start(); 
    beta.start(); 
} 

@Override 
public void run() { 
    listSize = test.size(); 
    while (listSize > 0){ 
     getLink(); 
    } 
} 

private synchronized void getLink(){ 
    String threadName = Thread.currentThread().getName(); 
    System.out.println(threadName + " printed " + test.indexOf(listSize - 1)); 
    test.remove(0); 
    listSize = test.size(); 
} 

} 

有人可以幫助指出我做錯了什麼,它可能是很多。

+2

你得到什麼錯誤或輸出? – Dev

回答

0

listSize > 0的測試未正確同步。當執行檢查時,列表可能不是空的,但在線程調用getLink()時實際上是空的。如果getLink()返回boolean而不是void可能會更容易,其中true表示該列表爲空,並且false表示它不是那麼每個線程都可以繼續調用該方法直到它返回false。在嘗試刪除項目之前,您還必須檢查getLink()頂部的列表是否爲空。

@Override 
public void run() { 
    while (getLink()); 
} 

private synchronized boolean getLink(){ 
    String threadName = Thread.currentThread().getName(); 
    System.out.println(threadName + " printed " + test.indexOf(test.size() - 1)); 
    if(!test.isEmpty()){ 
     test.remove(0); 
    } 
    return !test.isEmpty() 
} 
+0

...直到刪除(0)拋出一個異常;) –

0

有一個在具有一個多線程的方法去在索引0處抓取元件,由於同步自旋鎖將執行(幾乎)相同的單線程應用程序沒有意義的。多個線程可以讀取,但只能寫入一個。

0

基本問題是你正在做一件最好由一個線程完成的事情。 JVM處理這個問題,但允許一個線程鎖定鎖並在其他線程獲得機會之前使用所有元素。