也就是說當非Daemon線程都執行完畢時,java程序也就結束了。java
Daemon屬性須要在線程啓動以前設置,也就是線程執行start()方法以前設置。不能在線程啓動以後設置,那樣作是無效的。ide
import java.util.concurrent.TimeUnit; public class DaemonTest { public static void main(String[] args) { Thread thread = new Thread(new DaemonRunner(),"DaemonRunner"); thread.setDaemon(true); thread.start(); } static class DaemonRunner implements Runnable{ @Override public void run() { try{ TimeUnit.SECONDS.sleep(10); }catch (InterruptedException e){ System.out.println("Setp into InterruptedException."); } finally { System.out.println("DaemonThread finally run."); } } } }
程序運行,main線程中啓動了Daemon線程,而後main線程立刻就結束了,此時JVM中已經沒有非Daemon線程了,因此JVM退出了。JVM中的全部Daemon線程也都須要當即終止,即便finally塊中的內容尚未打印,DaemonRunner線程也終止了。spa
構建Daemon線程時,不能依靠finally塊中的內容確保執行關閉或者清理資源的邏輯。線程