关于后台线程和非后台线程

一、首先是一段代码

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的结束 而被终止 所以 打印结果为两条 

猜你喜欢

转载自blog.csdn.net/L_Person/article/details/85011847