2011-06-10 86 views
3

我正在編寫的應用程序在某個階段生成字符ArrayList。在這個階段,我想創建一個線程來處理這個ArrayList。問題是我如何通過此ArrayList的線程Java多線程 - 將數據結構傳遞給線程

描述代碼:

class thisApp { 
    /* Some initial processing creates an ArrayList - aList */ 

    Runnable proExec = new ProcessList(); //ProcessList implements Runnable 
    Thread th = new Thread(proExec); 
} 

描述代碼爲ProcessList中:

public class ProcessList implements Runnable { 
    public void run() { 
     /* Access the ArrayList - aList - and do something upon */ 
    } 
} 

我的問題是:如何傳遞和獲取ALIST在跑()?

回答

6

你可以簡單地傳遞aListProcessList的構造,它可以保留提及,直到它的需要:

class thisApp { 
    /* Some initial processing creates an ArrayList - aList */ 

    Runnable proExec = new ProcessList (aList); 
    Thread th = new Thread(proExec); 
} 

public class ProcessList implements Runnable { 
    private final ArrayList<Character> aList; 
    public ProcessList(ArrayList<Character> aList) { 
     this.aList = aList; 
    } 
    public void run() { 
     /* use this.aList */ 
    } 
} 

注:如果aList將被多個線程併發訪問,並且一個或多個線程修改它,則所有相關代碼將需要爲​​。

+0

這個列表不太可能被同時訪問。無論如何,謝謝! – check123 2011-06-10 17:20:58

4

將參數添加到ProcessList構造函數中。

public class ProcessList implements Runnable 
{  
    private final List<Foo> aList; 

    public ProcessList(List<Foo> aList) 
    { 
     this.aList = aList; 
    } 

    public void run() 
    { 
     System.out.println(aList.size()); 
    } 
} 

如果任何其他線程有權訪問列表,您必須小心併發訪問列表。

2

您可以使List成爲final,但最好將它傳遞給您的Runnable對象。

public class ProcessList implements Runnable { 
    List<Character> list; 
    public ProcessList(List<Character> list){ 
    this.list = list; 
    } 
    public void run() { 
     this.list.size(); 
    } 
} 
+0

_「你可以做出最終名單」 - 我不明白你在說什麼。 – 2011-06-10 17:16:33

+0

我在暗示,如果列表在範圍內,那麼通過使它成爲最終的,您可以在線程運行方法內引用它,而不必傳入它。 – Joel 2011-07-09 10:58:27