java daemon是什么,讓我們一起了解一下。
daemon線程是為我們創(chuàng)建的用戶線程提供服務(wù)的線程,比如說jvm的GC等等。這樣的線程有一個非常明顯的特征,當(dāng)用戶線程運行結(jié)束的時候,daemon線程將會自動退出。
daemon線程的特點是什么?
1、daemon線程創(chuàng)建的過程中需要先調(diào)用setDaemon方法進(jìn)行設(shè)置,然后再啟動線程,否則會報出IllegalThreadStateException異常。
2、由于daemon線程的終止條件是當(dāng)前是否存在用戶線程,所以我們不能指派daemon線程來進(jìn)行一些業(yè)務(wù)操作,而只能服務(wù)用戶線程。
3、daemon線程創(chuàng)建的子線程任然是daemon線程。
那么Daemon線程與非Daemon線程有什么區(qū)別?
基本上沒有什么區(qū)別,不同之處就是當(dāng) java虛擬機(jī)中所有的非Daemon線程都停止運行之后,即使還存在有Daemon線程,java虛擬機(jī)也會退出。這是因為Daemon線程沒有了被守護(hù)者,所以其也就沒有繼續(xù)運行的必要了。
Daemon線程可以通過調(diào)用Thread.setDaemon(true)設(shè)置,但是該方法的調(diào)用必須是在線程啟動之前設(shè)置,否則將會拋出一個IllegalThreadStateException異常,這是因為一個正在運行中的線程是不能被設(shè)置成守護(hù)線程的。
Daemon線程被用作完成支持性的工作,但是在java虛擬機(jī)退出的時候Daemon線程中的finally代碼塊并不一定執(zhí)行。
代碼示例:
public?class?TestDaemonThread?{ ????public?static?void?main(String[]?args)?{ ????????Thread?thread?=?new?Thread(new?Runnable()?{ ????????????@Override ????????????public?void?run()?{ ????????????????try?{ ????????????????????SleepUtils.second(1); ????????????????}finally?{ ????????????????????System.out.println("DaemonThread?finally?run."); ????????????????} ????????????????System.out.println(); ????????????} ????????},?"DaemonThread"); ????????//在線程執(zhí)行前設(shè)置為daemon線程 ????????thread.setDaemon(true); ????????thread.start(); ????} }
以上就是小編今天的分享了,希望可以幫助到大家。