java daemon是什么,讓我們一起了解一下。
daemon線程是為我們創(chuàng)建的用戶(hù)線程提供服務(wù)的線程,比如說(shuō)jvm的GC等等。這樣的線程有一個(gè)非常明顯的特征,當(dāng)用戶(hù)線程運(yùn)行結(jié)束的時(shí)候,daemon線程將會(huì)自動(dòng)退出。
daemon線程的特點(diǎn)是什么?
1、daemon線程創(chuàng)建的過(guò)程中需要先調(diào)用setDaemon方法進(jìn)行設(shè)置,然后再啟動(dòng)線程,否則會(huì)報(bào)出IllegalThreadStateException異常。
2、由于daemon線程的終止條件是當(dāng)前是否存在用戶(hù)線程,所以我們不能指派daemon線程來(lái)進(jìn)行一些業(yè)務(wù)操作,而只能服務(wù)用戶(hù)線程。
3、daemon線程創(chuàng)建的子線程任然是daemon線程。
那么Daemon線程與非Daemon線程有什么區(qū)別?
基本上沒(méi)有什么區(qū)別,不同之處就是當(dāng) java虛擬機(jī)中所有的非Daemon線程都停止運(yùn)行之后,即使還存在有Daemon線程,java虛擬機(jī)也會(huì)退出。這是因?yàn)镈aemon線程沒(méi)有了被守護(hù)者,所以其也就沒(méi)有繼續(xù)運(yùn)行的必要了。
Daemon線程可以通過(guò)調(diào)用Thread.setDaemon(true)設(shè)置,但是該方法的調(diào)用必須是在線程啟動(dòng)之前設(shè)置,否則將會(huì)拋出一個(gè)IllegalThreadStateException異常,這是因?yàn)橐粋€(gè)正在運(yùn)行中的線程是不能被設(shè)置成守護(hù)線程的。
Daemon線程被用作完成支持性的工作,但是在java虛擬機(jī)退出的時(shí)候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(); ????} }
以上就是小編今天的分享了,希望可以幫助到大家。