2013-12-09 75 views
-1

如何計算線程的數量,如果我在方法運行中創建兩個新的線程?它創造了很多次,並在記憶結束時下降。如何計算線程數量?

public class RabbitLab { 
    public static void main(String[] args) { 
     new Thread(new RabbitPrinter()).start(); 
    } 

} 


class RabbitPrinter implements Runnable { 
    public void run() { 
     for (int y=0 ; y < 3 ; y++){ 
     System.out.println("New rabbit born!"); 
     int x=0; 
     while (x != 3) { 
     { 

     new Thread(new RabbitPrinter()).start(); 
     new Thread(new RabbitPrinter()).start(); 
     x++ 

    } 

     } 
     } 
    } 
} 

回答

1

你指望在錯誤的方向,從而導致一個無限循環:

int x=0; 
    while (x != 3) { 
     new Thread(new RabbitPrinter()).start(); 
     new Thread(new RabbitPrinter()).start(); 
     x--; 
    } 

嘗試,而不是:

int x=3; 
    while (x != 0) { 
     new Thread(new RabbitPrinter()).start(); 
     new Thread(new RabbitPrinter()).start(); 
     x--; 
    } 

或者:

int x=0; 
    while (x != 3) { 
     new Thread(new RabbitPrinter()).start(); 
     new Thread(new RabbitPrinter()).start(); 
     x++; 
    } 

無論是後者的兩個版本將運行三個tim es,每次啓動兩個新線程,共創建六個線程。

要得到完全n線程,使用一個簡單的循環for

const int n = 3; 
for (int i = 0; i < n; ++i) 
{ 
    new Thread(new RabbitPrinter()).start(); 
} 

,或作爲while循環:

int x = 3; 
    while (x != 0) { 
     new Thread(new RabbitPrinter()).start(); 
     x--; 
    } 
+0

哦......它並不重要,當我開始新的線程,其新的x = 0,所有線程從x = 0開始,並開始增加到3,但我想獲得線程數例如8;在RabbitPrinter中,我運行了兩個新線程。 1 - > 2 - > 4 - > 8,在這一刻我想停止;它怎麼樣? – user3081544

+0

每次迭代只產生*一個線程*或者計算確切的線程數,即'x + = 2',而不是'x ++'。 – Domi

+0

請注意,如果在每次迭代中產生兩個線程,則不能產生奇數個線程。 – Domi

0

我不知道你有什麼做的。

這裏x = 0和你匹配x!=3和遞減x ..所以x永遠3.

增量X,而不是遞減....

x++ 
+0

哦...它並不重要,當我開始新的線程,其新的x = 0,所有線程從x = 0開始,並開始增加到3, – user3081544

+0

,但你decementing ..增加x。 。看到我編輯的答案 – stinepike

+0

其小錯誤,即時通訊抱歉,但我的問題仍然是 – user3081544

0

假設你希望你的循環計數器適用於所有線程,而不僅僅是一個線程,所以不應該使用'x'作爲局部變量,而應該聲明它爲靜態的(所有實例共享它)和AtomicInteger(所有線程都可以更新它安全無爭議問題):

試試這個:

class RabbitPrinter implements Runnable { 
private static AtomicInteger x = new AtomicInteger(0); 
public void run() { 
    for (int y=0 ; y < 3 ; y++){ 
    System.out.println("New rabbit born!"); 

    while (x.getAndIncrement() < 3) { 
    new Thread(new RabbitPrinter()).start(); 
    new Thread(new RabbitPrinter()).start(); 
    } 
    } 
} 
} 
+0

謝謝,它幫助我 – user3081544

0

您可以創建一定數量的線程停止當您使用FixedThreadPool從(遺囑執行人)達到你的極限[http://docs.oracle.com/javase/7 /docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29]

除此之外,ExecutorService提供了關閉池的實用程序方法。