国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - JVM中的守護線程示例詳解

JVM中的守護線程示例詳解

2021-06-28 10:23技術小黑屋 Java教程

這篇文章主要給大家介紹了關于JVM中守護線程的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在java中有兩類線程:user thread(用戶線程)、daemon thread(守護線程)

用個比較通俗的比如,任何一個守護線程都是整個jvm中所有非守護線程的保姆:

只要當前jvm實例中尚存在任何一個非守護線程沒有結束,守護線程就全部工作;只有當最后一個非守護線程結束時,守護線程隨著jvm一同結束工作。

daemon的作用是為其他線程的運行提供便利服務,守護線程最典型的應用就是 gc (垃圾回收器),它就是一個很稱職的守護者。

在之前的《詳解jvm如何處理異常》提到了守護線程,當時沒有詳細解釋,所以打算放到今天來解釋說明一下jvm守護線程的內容。

特點

  • 通常由jvm啟動
  • 運行在后臺處理任務,比如垃圾回收等
  • 用戶啟動線程執行結束或者jvm結束時,會等待所有的非守護線程執行結束,但是不會因為守護線程的存在而影響關閉。

判斷線程是否為守護線程

判斷一個線程是否為守護線程,主要依據如下的內容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/* whether or not the thread is a daemon thread. */
private boolean daemon = false;
 
/**
* tests if this thread is a daemon thread.
*
* @return <code>true</code> if this thread is a daemon thread;
*  <code>false</code> otherwise.
* @see #setdaemon(boolean)
*/
public final boolean isdaemon() {
 return daemon;
}

下面我們進行一些簡單的代碼,驗證一些關于守護線程的特性和一些猜測。

輔助方法

打印線程信息的方法,輸出線程的組,是否為守護線程以及對應的優先級。

?
1
2
3
4
5
6
7
8
9
private static void dumpallthreadsinfo() {
 set<thread> threadset = thread.getallstacktraces().keyset();
 for(thread thread: threadset) {
 system.out.println("dumpallthreadsinfo thread.name=" + thread.getname()
  + ";group=" + thread.getthreadgroup()
  + ";isdaemon=" + thread.isdaemon()
  + ";priority=" + thread.getpriority());
 }
}

線程睡眠的方法

?
1
2
3
4
5
6
7
8
private static void makethreadsleep(long durationinmillseconds) {
 try {
 thread.sleep(durationinmillseconds);
 } catch (interruptedexception e) {
 e.printstacktrace();
 }
 
}

驗證普通的(非守護線程)線程會影響進程(jvm)退出

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private static void testnormalthread() {
 long starttime = system.currenttimemillis();
 new thread("normalthread") {
 @override
 public void run() {
  super.run();
  //保持睡眠,確保在執行dumpallthreadsinfo時,該線程不會因為退出導致dumpallthreadsinfo無法打印信息。
  makethreadsleep(10 * 1000);
  system.out.println("startnormalthread normalthread.time cost=" + (system.currenttimemillis() - starttime));
 }
 }.start();
 //主線程暫定3秒,確保子線程都啟動完成
 makethreadsleep(3 * 1000);
 dumpallthreadsinfo();
 system.out.println("mainthread.time cost = " + (system.currenttimemillis() - starttime));
}

獲取輸出日志

dumpallthreadsinfo thread.name=signal dispatcher;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=9
dumpallthreadsinfo thread.name=attach listener;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=9
dumpallthreadsinfo thread.name=monitor ctrl-break;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=true;priority=5
dumpallthreadsinfo thread.name=reference handler;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=10
dumpallthreadsinfo thread.name=main;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=false;priority=5
dumpallthreadsinfo thread.name=normalthread;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=false;priority=5
dumpallthreadsinfo thread.name=finalizer;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=8
mainthread.time cost = 3009
startnormalthread normalthread.time cost=10003
process finished with exit code 0 結束進程

我們根據上面的日志,我們可以發現

  • startnormalthread normalthread.time cost=10003代表著子線程執行結束,先于后面的進程結束執行。
  • process finished with exit code 0 代表 結束進程

以上日志可以驗證進程是在我們啟動的子線程結束之后才退出的。

驗證jvm不等待守護線程就會結束

其實上面的例子也可以驗證jvm不等待jvm啟動的守護線程(reference handler,signal dispatcher等)執行結束就退出。

這里我們再次用一段代碼驗證一下jvm不等待用戶啟動的守護線程結束就退出的事實。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private static void testdaemonthread() {
 long starttime = system.currenttimemillis();
 thread daemonthreadsetbyuser = new thread("daemonthreadsetbyuser") {
  @override
  public void run() {
   makethreadsleep(10 * 1000);
   super.run();
   system.out.println("daemonthreadsetbyuser.time cost=" + (system.currenttimemillis() - starttime));
  }
 };
 daemonthreadsetbyuser.setdaemon(true);
 daemonthreadsetbyuser.start();
 //主線程暫定3秒,確保子線程都啟動完成
 makethreadsleep(3 * 1000);
 dumpallthreadsinfo();
 system.out.println("mainthread.time cost = " + (system.currenttimemillis() - starttime));
}

上面的結果得到的輸出日志為

dumpallthreadsinfo thread.name=signal dispatcher;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=9
dumpallthreadsinfo thread.name=attach listener;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=9
dumpallthreadsinfo thread.name=monitor ctrl-break;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=true;priority=5
dumpallthreadsinfo thread.name=reference handler;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=10
dumpallthreadsinfo thread.name=main;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=false;priority=5
dumpallthreadsinfo thread.name=daemonthreadsetbyuser;group=java.lang.threadgroup[name=main,maxpri=10];isdaemon=true;priority=5
dumpallthreadsinfo thread.name=finalizer;group=java.lang.threadgroup[name=system,maxpri=10];isdaemon=true;priority=8
mainthread.time cost = 3006

process finished with exit code 0

我們可以看到,上面的日志沒有類似daemonthreadsetbyuser.time cost=的信息。可以確定jvm沒有等待守護線程結束就退出了。

注意:

  • 新的線程是否初始為守護線程,取決于啟動該線程的線程是否為守護線程。
  • 守護線程默認啟動的線程為守護線程,非守護線程啟動的線程默認為非守護線程。
  • 主線程(非守護線程)啟用一個守護線程,需要調用thread.setdaemon來設置啟動線程為守護線程。

關于priority與守護線程的關系

有一種傳言為守護線程的優先級要低,然而事實是

  • 優先級與是否為守護線程沒有必然的聯系
  • 新的線程的優先級與創建該線程的線程優先級一致。
  • 但是建議將守護線程的優先級降低一些。

感興趣的可以自己驗證一下(其實上面的代碼已經有驗證了)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://droidyue.com/blog/2018/12/16/daemon-thread-in-java/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩一区在线播放 | 高清成人 | 在线观看亚洲一区二区三区 | 污视频网站在线观看 | 青青草久久 | 九九九久久国产免费 | 精品第一页 | av免费资源| 亚洲综合自拍 | 99精品国产高清一区二区麻豆 | 一本一道久久精品综合 | 你懂的免费在线观看 | 午夜看片在线观看 | 日韩精品www| 亚洲国产免费 | 免费在线成人网 | 在线播放视频一区二区 | 成人午夜精品一区二区三区 | 日本做暖暖视频高清观看 | 欧美国产综合 | 欧美一区二区三区 | 国产精品毛片在线 | 日韩在线观看 | 午夜私人影院在线观看 | 黄色成人在线观看视频 | 极品国产精品 | 成人高清视频在线观看 | 91.成人天堂一区 | 久久久777 | 亚洲国产一区在线 | 亚洲一区中文字幕 | 91精品蜜臀在线一区尤物 | 成人免费乱码大片a毛片软件 | 久久久久久极品 | 91av电影在线观看 | 一区二区三区高清不卡 | 最新高清无码专区 | 亚洲 欧美 自拍偷拍 | 日韩美一级片 | 亚洲国产免费 | 国产黄色片免费观看 |