2011-02-01 80 views
1

嗨,我正在處理的程序需要使用可變數量的線程來完成任務。擴展Thread的類Mythread存儲在我創建的另一個類X中。在Java中創建未知數量的線程?

應該發生的事情是當我調用X時,它傳遞了一個參數n,它指定了可以使用的最大線程數量。我不知道如何去創建線程的施氮量,因爲一切我在網上看了指出一個線程必須顯式調用像

Thread thread1 = new Mythread(); 

我想:

while (0 >= n) 
    {Thread thread1 = new Mythread(); n--;} 

但沒沒有工作。有關如何去做這件事的任何想法?對不起,如果我的問題有點模糊,這是爲了學校,我想自己學習材料,然後張貼項目的大部分。如果您還需要其他信息或澄清,請隨時提問。

+0

最初`0> = n`是錯誤的,所以循環從不運行。 – 2011-02-01 02:33:14

+0

0> = n - 形式條件(恆定比較變量)不合要求的另一個原因。應該是(n> = 0),每個人都可以閱讀而不會進行精神逆轉。但更好的是,這應該是一個`for`結構 - `(int xa = 0; xa 2011-02-01 02:52:02

回答

2

無論何時您需要可變數量的變量,請嘗試一個數組。那麼你將有:

for(i = 0; i < n; ++i) 
    threadarray[i] = new Mythread(); 

你的直接問題是,你從來沒有開始你的循環,因爲你有條件倒退。但是將線程保存在數組中是確保它們不會被垃圾收集的好主意。

+0

線程通常不會被垃圾回收,因爲它們被垃圾收集器認爲是「頂級」對象(嗯,我認爲守護線程是,但不是用戶線程,但在文檔中找不到它)。我也會使用一個集合,比如LinkedList,所以你不需要太多的工作來分配正確的大小和管理數組的存儲。 – 2011-02-01 02:37:27

+1

@約翰:不是一個線程必須明確啓動?如果是這樣,他們必須保持可及,以便他可以迭代並啓動它們。如果這個數字事先並不知道,我肯定會推薦一個集合,但它是這樣的,所以數組是完成工作的最簡單的工具。 – 2011-02-01 02:42:52

7

通常你會做的是建立一個彙集執行人與線程的有限數量的,並使用一個循環或其他機制的可調用任務的任意數傳:

ExecutorService exec = Executors.newFixedThreadPool(n); 
for (int i = 0; i < n; ++i) { 
    exec.submit(new MyCallable()); 
} 
0

也許,你缺少的是您必須致電start()才能啓動Thread

但除此之外,你可能不應該聲明Thread的子類。更好的選擇是:

  • 將在實現Runnable接口的類的run()方法的線程的主線代碼,並與您的類作爲參數的一個實例,實例化Thread對象;例如

    new Thread(new MyRunnable(...)).start(); 
    
  • 按照@John Gaughan的回答所述,使用ExecutorService

  • 使用其他類型的線程池。

有界線程池是一個好主意,如果您有可能無限數量的任務執行,並且它們不是嚴格要求並行運行。 (Java的傾向於使用大量的資源和性能較差,如果你創建的線程數量巨大。)

(的Thread創建子類是在這幾天一般不贊成,因爲它會導致類似錯誤地重寫Thread.start()方法的錯誤,等等不幸的是,有很多舊的教程和例子在Thread附近浮動。)