溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

啟動一個最簡單的Java main程序時有多少個線程被創(chuàng)建

發(fā)布時間:2021-06-23 14:45:54 來源:億速云 閱讀:206 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要講解了“啟動一個最簡單的Java main程序時有多少個線程被創(chuàng)建”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“啟動一個最簡單的Java main程序時有多少個線程被創(chuàng)建”吧!

 在java中,啟動一個簡單的main程序,并不是只是單單創(chuàng)建了一個main線程而已,JVM會自動創(chuàng)建一些輔助用的線程, 這4個線程,加上,main,所以總共會有5個線程被創(chuàng)建 主要有以下幾個:

Attach ListenerAttach Listener線程是負(fù)責(zé)接收到外部的命令,而對該命令進(jìn)行執(zhí)行的并且吧結(jié)果返回給發(fā)送者。通常我們會用一些命令去要求jvm給我們一些反 饋信 息,如:java -version、jmap、jstack等等。如果該線程在jvm啟動的時候沒有初始化,那么,則會在用戶第一次執(zhí)行jvm命令時,得到啟動。

Signal Dispatcher:前面我們提到第一個Attach Listener線程的職責(zé)是接收外部jvm命令,當(dāng)命令接收成功后,會交給signal dispather線程去進(jìn)行分發(fā)到各個不同的模塊處理命令,并且返回處理結(jié)果。signal dispather線程也是在第一次接收外部jvm命令時,進(jìn)行初始化工作。

Finalizer:這個線程也是在main線程之后創(chuàng)建的,其優(yōu)先級為10,主要用于在垃圾收集前,調(diào)用對象的finalize()方法

Reference Handler:VM在創(chuàng)建main線程后就創(chuàng)建Reference Handler線程,其優(yōu)先級最高,為10,它主要用于處理引用對象本身(軟引用、弱引用、虛引用)的垃圾回收問題。

以上這部分內(nèi)容引用自 http://ifeve.com/jvm-thread/,可以取這個地址查看更多線程的信息

這4個線程,加上,main,所以總共會有5個線程被創(chuàng)建,可以通過這幾行代碼來查看

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

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

for (ThreadInfo info : threadInfos ) {

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

}

  但是,當(dāng)前活動的線程只有1個,就是main,System.out.println(Thread.activeCount()); 用這條命令返回值是1。這也經(jīng)常被用作以下場合的判斷

比如,在main線程中創(chuàng)建多個子線程后,如果子線程的耗時比main線程要長,main線程就會再子線程之前結(jié)束。假如main線程的結(jié)果需要用到子線程的返回值,那么我們通常就在main線程中加上這句代碼:

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

來判斷子線程是否全部運行結(jié)束,也就是當(dāng)前活動線程只有main線程一個。這樣做在windows下是沒錯的,但是!?。?/p>

在linux下就不是這樣了,你會發(fā)現(xiàn),即使所有的子線程全部結(jié)束,打印當(dāng)前的活動線程是2!?。《皇?,除了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官網(wǎng)的原話。大家可以自行翻譯。 結(jié)論:在windows下可以用 Thread.activeCount() >1來判斷子線程是否全部結(jié)束,但是linux中應(yīng)該是 Thread.activeCount() > 2

感謝各位的閱讀,以上就是“啟動一個最簡單的Java main程序時有多少個線程被創(chuàng)建”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對啟動一個最簡單的Java main程序時有多少個線程被創(chuàng)建這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI