daemon线程即守护线程
当一个JVM中不存在非Daemon线程时,JVM将会退出
也就是说当非Daemon线程都执行完毕时,java程序也就结束了。
可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。而且必须在线程启动之前进行设置
Daemon属性需要在线程启动之前设置,也就是线程执行start()方法之前设置。不能在线程启动之后设置,那样做是无效的。
示例代码
源码
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线程也终止了。
构建Daemon线程时,不能依靠finally块中的内容确保执行关闭或者清理资源的逻辑。