默認情況下,Java 進程需要等待所有線程都運行結束,纔會結束。有一種特殊的線程叫做守護線程,只要其它非守護線程運行結束了,即使守護線程的代碼沒有執行完,也會強制結束。
例:
log.debug("開始運行...");
Thread t1 = new Thread(() -> {
log.debug("開始運行...");
sleep(2);
log.debug("運行結束...");
}, "daemon");
// 設置該線程爲守護線程
t1.setDaemon(true);
t1.start();
sleep(1);
log.debug("運行結束...");
輸出
08:26:38.123 [main] c.TestDaemon - 開始運行...
08:26:38.213 [daemon] c.TestDaemon - 開始運行...
08:26:39.215 [main] c.TestDaemon - 運行結束...
注意
垃圾回收器線程就是一種守護線程
Tomcat 中的 Acceptor 和 Poller 線程都是守護線程,所以 Tomcat 接收到 shutdown 命令後,不會等待它們處理完當前請求