Daemon後台執行緒

2021-09-26 08:45:50 字數 1962 閱讀 2412

所謂後台執行緒(daemon),是指程式在執行時提供的一種通用執行緒服務,這種執行緒並不屬於程式中不可或缺的部分。因此,所有的非後台執行緒結束後,程式也就會終結所有的執行緒,同時會殺死所有的後台現場。也就是說,程式中只要有後台執行緒還在執行,那麼程式就不會終止。比如,執行main()方法就是乙個非後台執行緒。

public class daemonthread implements runnable catch (interruptedexception e) }}

public static void main(string args) throws interruptedexception

system.out.println("all dacmoi start!");

timeunit.milliseconds.sleep(1000);}}

這裡的thread.setdaemon(true);就是把乙個執行緒的daemon屬性設定為true,那麼系統就會認為她是乙個後台執行緒。當main()方法執行完畢後,就一切終止了,包括後台執行緒。但是如果在main()方法中最後一句加上sleep讓它休眠,那麼你就會看到後台執行緒開始執行。這樣就是顯式的建立了乙個後台執行緒。

同時可以使用threadfactory隱式的建立後台執行緒。

public class daemonthreadfactory implements threadfactory 

/*** 後台執行緒,main方法結束後,便馬上結束

* @param args

* @throws interruptedexception

*/public static void main(string args) throws interruptedexception

service.shutdown();

system.out.println("test");

timeunit.milliseconds.sleep(167);}}

daemonthreadfactory 要使用執行緒池executors來配合使用,唯一的差異化就是把你提供的執行緒都隱式的設定為deaemon=true,每個靜態的executorservice 都可以接受乙個threadfactory物件。而這個物件將被預設的建立新的執行緒。也可以通過isdaemon()判斷乙個執行緒是否是乙個後台執行緒

如果乙個執行緒被設定為後台執行緒,但是它裡面派生了很多子執行緒,那麼派生的子執行緒也會設定為後台執行緒。

後台執行緒中若是存在finally()方法,猜會不會執行呢?? 

答案是不會執行,因為即便finally這種行為是正確的,但是情況依然如此,當最後乙個後台執行緒終止時,後台執行緒會突然終止,因此一旦main()結束,那麼所有的執行緒都將結束。而不會有你的希望出現的確認形式。因此,你不能優雅的關閉所有的後台執行緒,使用exectuor是一種更好的方式。

參考位址

Mongodb後台daemon方式啟動

mongodb可以通過命令列方式和配置檔案的方式來啟動,具體命令如下 命令列 shell root localhost mongodb bin mongod dbpath data db 配置檔案 shell root localhost mongodb bin mongod f mongodb.c...

Daemon執行緒和Join執行緒

daemon執行緒稱為守護執行緒 非常喜歡這個名字 執行緒一旦被設定為守護執行緒,當非守護執行緒結束,守護執行緒即使沒有執行完,也必須隨之全部結束。例如我們曾經玩兒過的坦克大戰,一旦守護的老巢完蛋了,其它守護坦克沒死也要結束。daemon執行緒的實質作用是為主執行緒其他執行緒的執行提供服務。user...

守護 Daemon 執行緒和使用者 User 執行緒

使用者 user 執行緒 可以認為是系統的工作執行緒,它會完成整個系統的業務操作 守護 daemon 執行緒 public class threaddemo implements runnable catch interruptedexception e system.out.println thr...