2013-04-08 40 views
3

在下面的程序main線程調用它獲取一個新的開始thread.It調用startThreadgreet_thread這反過來又上一個新的線程調用greetstartThread致電greet_thread直到count is less than or equal to 10瞭解特定線程啓動的線程數

有什麼辦法可以告訴有多少線程當前正在運行?更具體的說,我想知道當前正在運行的線程的數量是由greet_thread的調用開始的。由於greet_thread被稱爲10 times,很明顯10 threads將在最後單獨運行。但是有沒有辦法知道這個數字?

這是線程的層次在項目開始:

main_thread 
    | 
\/
starts a new thread by calling startThread 
    | 
\/
startThread starts a new thread by calling greet_thread-->--| 
    |               | 
\/              \/gets called 10 times 
greetThread is started with an infinite loop------<------- | 
    | 
\/
greet() method is called 

class Tester { 

    private static int count = 0; 

    public static void main(String args[]) { 
     startThread(); 
    } 

    public static void startThread() { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       while(count <= 10) { 
        greet_thread(count); 
        count++; 
       } 
      } 
     }; 
     new Thread(r).start(); 
    } 

    public static void greet_thread(final int count) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       while(true) { 
        greet(); 
       } 
      } 
     }; 
     new Thread(r).start(); 
    } 

    public static void greet() { 
     System.out.println("GREET !"); 
    } 
} 
+0

你能給你爲什麼想知道一個例子,它說明將如何使用?例如,你可以不使用計數器或線程池嗎? – 2013-04-08 13:20:17

+0

@PeterLawrey只是爲了檢查有多少線程在任何情況下運行。必須有一些30K的線程運行..有一個確切的數字。所以想知道。 – saplingPro 2013-04-08 13:24:47

回答

3

如果你有30K線程中運行你有問題。我懷疑你沒有這麼多的CPU。您可以使用VisualVM或ThreadGroup或線程池或使用計數器來檢查線程的數量。

通常當你設計一個程序時,你知道你想要多少個線程,你只需要檢查這種情況。你不會刻意編寫一個程序,但它的線程數量很大,但是數量很多,並且試着弄清它後面的內容,因爲這個數字不會很有用。

+2

+1,只是'我懷疑你沒有這麼多的CPU'。 – Perception 2013-04-08 13:36:57

+0

我同意30k線程是很多。但是,如果你想以編程方式監視你的線程,也許你可以使用ThreadMonitor實現的類[here](http://kickjava.com/src/ThreadMonitor.java.htm) – 2013-04-08 13:37:25

+0

我想和你討論一個問題。我們可以請討論這裏@ http://chat.stackoverflow.com/rooms/27781/discussion-between-peter-lawrey-and-saplingpro – saplingPro 2013-04-08 16:08:31

0

如果您只是要計算仍然存在的線程數,則更改run方法以在啓動時增加共享計數器,並在其終止時遞減(通常或通過異常)。

請注意,您需要使用類似AtomicInteger的東西來實現計數器...或者執行某些操作來同步更新。增加一個原始整數不是原子的,如果沒有充分同步,這可能導致heisenbugs。

(與同爲現有count變量!)

+0

啊!你可以請一個簡單的示範 – saplingPro 2013-04-08 15:52:11

+0

什麼?如何使用AtomicInteger?你應該能夠通過閱讀javadocs瞭解它!或者:http://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html – 2013-04-09 03:41:33