参考:
守护线程与非守护线程 > https://www.cnblogs.com/lixuan1998/p/6937986.html
概念
进程中会同时存在二种线程:也就是守护线程和非守护线程,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。但是必须在thread.start()之前设置,否则就会抛出一个IllegalThreadStateException异常,不能把正在运行的常规线程设置为守护线程。
实例
我们看以下例子:
// MyTask.java
import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask
{
@Override
public void run() {
System.out.println("begain time:"+new Date());
}
}
// Test.java
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test {
public static void main(String[] args){
System.out.println("now:"+new Date());
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.SECOND,10);
Date date=calendar.getTime();
MyTask task=new MyTask();
Timer timer=new Timer();
//后一个参数是任务的执行时间
timer.schedule(task,date);
}
}
我们执行这个程序可以发现,任务虽然运行完了,但进程还未销毁,呈红色状态,为什么会出现这种情况呢?因为Timer就是启动一个新的线程,而且启动的线程不是守护线程,所以一直运行。
运行结果接着,我们按ctrl+c停止当前程序,然后更改一下Test.java里面的代码,在Timer的构造函数中传入true,也就是把从Timer里面开启的线程设置成守护线程。
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test1 {
public static void main(String[] args){
System.out.println("now:"+new Date());
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.SECOND,10);
Date date=calendar.getTime();
MyTask task=new MyTask();
// 在Timer的构造函数中传入true
Timer timer=new Timer(true);
timer.schedule(task,date);
}
}
因为主线程执行完毕以后,就没有需要被守护的线程了,所以,即使我们安排了任务,也会因为主线程的退出而不会被执行。
运行结果如下
到这里想必已经能够理解什么是守护线程和非守护线程了,不过,我还想补充一下,就是,在守护线程中创建出的线程,也是守护线程,具体的,大家可以自己写一个程序作测试。
网友评论