也就是说当非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块中的内容确保执行关闭或者清理资源的逻辑。线程