最近工作不忙,研究了一下java线程方面的东西,对守护线程一直是很感兴趣的,就找了个示例练习了一下,了解了一些。
所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程。反过来说,只要有任何非后台线程(用户线程)还在运行,程序就不会终止。后台线程在不执行finally子句的情况下就会终止其run方法。后台线程创建的子线程也是后台线程。
通过运行结果来看,子线程是受控于主线程的,子线程退出时,JVM强制终止了守护线程,但并非以异常方式结束的,连finally语句块也不执行,这样的话想要捕获守护线程退出的状态似乎增加了难度。
所谓的后台线程,是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。因此当所有的非后台线程结束时,程序也就终止了,同时会杀死所有后台线程。反过来说,只要有任何非后台线程(用户线程)还在运行,程序就不会终止。后台线程在不执行finally子句的情况下就会终止其run方法。后台线程创建的子线程也是后台线程。
import java.util.concurrent.TimeUnit;
/**
* 描述: 后台守护线程示例
* 版权: Copyright (c) 2012
* 版本: 1.0
* 创建日期: 2012-7-3
* 创建时间: 上午09:57:27
*/
public class DaemonDemo implements Runnable{
public void run()
{
try{
while(true)
{
Thread.sleep(1000);
System.out.println("#"+Thread.currentThread().getName());
}
}catch(InterruptedException e)
{
e.printStackTrace();
}
finally{
System.out.println("finally!");
}
}
public static void main(String []args)
{
for(int i= 0;i<10;i++)
{
Thread deamon = new Thread(new DaemonDemo());
deamon.setDaemon(true);
deamon.start();
}
System.out.println("All deamon started!");
try{
TimeUnit.MICROSECONDS.sleep(1000*5000);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println("Main exit!");
}
}
通过运行结果来看,子线程是受控于主线程的,子线程退出时,JVM强制终止了守护线程,但并非以异常方式结束的,连finally语句块也不执行,这样的话想要捕获守护线程退出的状态似乎增加了难度。