一、首先是一段代码
import java.util.concurrent.TimeUnit;
class ADaemon implements Runnable{
@Override
public void run() {
try{
System.out.println("Starting ADaemon");
TimeUnit.SECONDS.sleep(1);//作用为防止线程抢占资源的原因影响测试结果
}catch(Exception e){
System.out.println("Exiting via InterruptedException");
}finally{
System.out.println("Thie should always run?");
}
}
public static void main(String[] args){
//当最后一个非后台线程终止时,后台线程会“突然”终止
//故一旦main退出,jvm就会立即关闭所有的后台进程,而不会有任何你希望出现的确认形式
Thread t = new Thread(new ADaemon());
//如果注释掉下面这句话,finally将会执行
t.setDaemon(true);
t.start();
}
}
此时打印结果为
Starting ADaemon
或者什么都不打印
分析原因 : 打印一条 是因为 main本身为前台线程(非后台)所以,当将 线程 t 设置为后台线程 会出现当 main执行结束后,线程 t 还在休眠所以导致 只打印一条 另一种情况为 main执行完成后 线程 t 也没有抢占到资源所以直接就不执行。
而当 t 为非后台线程时 不会因为main的结束 而被终止 所以 打印结果为两条