啓動一個最簡單的Java main程序時有多少個線程被建立

 在java中,啓動一個簡單的main程序,並非只是單單建立了一個main線程而已,JVM會自動建立一些輔助用的線程,主要有如下幾個:java

  Attach Listener:Attach Listener線程是負責接收到外部的命令,而對該命令進行執行的而且吧結果返回給發送者。一般咱們會用一些命令去要求jvm給咱們一些反 饋信 息,如:java -version、jmap、jstack等等。若是該線程在jvm啓動的時候沒有初始化,那麼,則會在用戶第一次執行jvm命令時,獲得啓動。linux

  Signal Dispatcher:前面咱們提到第一個Attach Listener線程的職責是接收外部jvm命令,當命令接收成功後,會交給signal dispather線程去進行分發到各個不一樣的模塊處理命令,而且返回處理結果。signal dispather線程也是在第一次接收外部jvm命令時,進行初始化工做。windows

  Finalizer:這個線程也是在main線程以後建立的,其優先級爲10,主要用於在垃圾收集前,調用對象的finalize()方法;多線程

  Reference Handler:VM在建立main線程後就建立Reference Handler線程,其優先級最高,爲10,它主要用於處理引用對象自己(軟引用、弱引用、虛引用)的垃圾回收問題。oracle

以上這部份內容引用自 http://ifeve.com/jvm-thread/,能夠取這個地址查看更多線程的信息app

這4個線程,加上,main,因此總共會有5個線程被建立,能夠經過這幾行代碼來查看jvm

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();ide

ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false);spa

for (ThreadInfo info : threadInfos ) {線程

  System.out.println("[" + info.getThreadId() + "]" + info.getThreadName());

}

  可是,當前活動的線程只有1個,就是main,System.out.println(Thread.activeCount()); 用這條命令返回值是1。這也常常被用做如下場合的判斷

好比,在main線程中建立多個子線程後,若是子線程的耗時比main線程要長,main線程就會再子線程以前結束。假如main線程的結果須要用到子線程的返回值,那麼咱們一般就在main線程中加上這句代碼:

  System.out.println(Thread.activeCount() >1),

來判斷子線程是否所有運行結束,也就是當前活動線程只有main線程一個。這樣作在windows下是沒錯的,可是!!!

在linux下就不是這樣了,你會發現,即便全部的子線程所有結束,打印當前的活動線程是2!!!而不是1,除了main線程以外,linux下還會有一個Monitor Ctrl-Break 線程存在,這個線程是用來幹嗎的呢?

Monitoring Thread Activity With Thread Dumps Thread dumps, or "thread stack traces," reveal information about an application's activity that can help you diagnose problems and better optimize application and JVM performance; for example, thread dumps can show the occurrence of "deadlock" conditions, which can seriously impact application performance. You can create a thread dump by invoking a control break (usually by pressing Ctrl-Break or Ctrl-\ or SIGQUIT on linux). This section provides information on working with thread dumps. It includes information on these subjects: 1.Lock Information in Thread Dumps 2.Detecting Deadlocks

這是oracle官網的原話。你們能夠自行翻譯。 結論:在windows下能夠用 Thread.activeCount() >1來判斷子線程是否所有結束,可是linux中應該是 Thread.activeCount() > 2

相關文章
相關標籤/搜索