java多线程之精灵线程/守护线程(Daemon)
Posted 孔子-说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程之精灵线程/守护线程(Daemon)相关的知识,希望对你有一定的参考价值。
在java中,本身无法使虚拟主机保持活动的线程称为精灵线程Daemon,又称为守护线程,就是运行在程序后台的线程,一般被用于在后台为其它线程提供服务。既然它在后台运行,当前台线程(即主线程,又叫用户线程)运行完,主体程序就结束了,理所当然该后台线程也应该随之结束了。
当一个应用程序的所有非精灵线程停止运行时,即使仍有精灵线程还在运行,该应用程序也将终止,反过来,只要还有非精灵线程在运行,应用程序就不会停止。我们可以通过setDaemon(boolean on)来设置某线程为精灵线程。用isDaemon()来判断某线程是否为精灵线程或守护线程。
注意:要想设置一个线程为精灵守护线程,setDaemon必须在start前调用。
精灵线程和非精灵线程的区别
/**
* 子线程
*
* @Author kongzi
*/
public class ThreadMark_Child extends Thread {
public void run(){
for(int i = 1; i <= 20;i++){
try{
Thread.sleep(100);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println("子线程 "+i);
}
}
}
子线程设置为精灵线程时
/**
* 主线程/用户线程
*
* @Author kongzi
*/
public class MainThread extends Thread{
public static void main(String [] args){
ThreadMark_Child tm = new ThreadMark_Child();
tm.setDaemon(true);// 设置为精灵线程
tm.start();
System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
try{
Thread.sleep(1000);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经结束");
}
}
// 以下是运行结果
子线程是精灵线程吗?true
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束
子线程设置为非精灵线程时
/**
* 主线程/用户线程
*
* @Author kongzi
*/
public class MainThread extends Thread{
public static void main(String [] args){
ThreadMark_Child tm = new ThreadMark_Child();
tm.setDaemon(false);// 设置为非精灵线程
tm.start();
System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
try{
Thread.sleep(1000);
} catch (InterruptedException ex){
ex.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经结束");
}
}
// 以下是运行结果
子线程是精灵线程吗?false
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束
子线程 10
子线程 11
子线程 12
子线程 13
子线程 14
子线程 15
子线程 16
子线程 17
子线程 18
子线程 19
子线程 20
结论
从代码运行结果可以看出来,当子线程设置为精灵线程时,若主线程结束,该精灵线程即使未运行完成也会结束。当子线程设置为非精灵线程时,主线程是否结束不影响非精灵线程的执行。
以上是关于java多线程之精灵线程/守护线程(Daemon)的主要内容,如果未能解决你的问题,请参考以下文章
Java多线程系列---“基础篇”10之 线程优先级和守护线程