您好,登錄后才能下訂單哦!
這篇文章主要講解了“啟動一個最簡單的Java main程序時有多少個線程被創建”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“啟動一個最簡單的Java main程序時有多少個線程被創建”吧!
在java中,啟動一個簡單的main程序,并不是只是單單創建了一個main線程而已,JVM會自動創建一些輔助用的線程, 這4個線程,加上,main,所以總共會有5個線程被創建 主要有以下幾個:
Attach Listener:Attach Listener線程是負責接收到外部的命令,而對該命令進行執行的并且吧結果返回給發送者。通常我們會用一些命令去要求jvm給我們一些反 饋信 息,如:java -version、jmap、jstack等等。如果該線程在jvm啟動的時候沒有初始化,那么,則會在用戶第一次執行jvm命令時,得到啟動。
Signal Dispatcher:前面我們提到第一個Attach Listener線程的職責是接收外部jvm命令,當命令接收成功后,會交給signal dispather線程去進行分發到各個不同的模塊處理命令,并且返回處理結果。signal dispather線程也是在第一次接收外部jvm命令時,進行初始化工作。
Finalizer:這個線程也是在main線程之后創建的,其優先級為10,主要用于在垃圾收集前,調用對象的finalize()方法;
Reference Handler:VM在創建main線程后就創建Reference Handler線程,其優先級最高,為10,它主要用于處理引用對象本身(軟引用、弱引用、虛引用)的垃圾回收問題。
以上這部分內容引用自 http://ifeve.com/jvm-thread/,可以取這個地址查看更多線程的信息
這4個線程,加上,main,所以總共會有5個線程被創建,可以通過這幾行代碼來查看
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false,false);
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
感謝各位的閱讀,以上就是“啟動一個最簡單的Java main程序時有多少個線程被創建”的內容了,經過本文的學習后,相信大家對啟動一個最簡單的Java main程序時有多少個線程被創建這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。