本节摘要:介绍守护线程,代码示例
一、守护线程
thread 类中有一个isDaemon的布尔变量,如果isDaemon=true代表该线程为守护线程,否则为用户线程
1.1 守护线程特点
- 当所有用户线程结束时,程序会终止,同时杀死进程中的所有守护线程
- 守护线程一般在后台执行任务
- 守护线程创建的线程被自动设置为守护线程
二、守护线程示例
2.1 示例1
public class DaemonThreadDemo implements Runnable {
@Override
public void run() {
try {
while (true) {
TimeUnit.MILLISECONDS.sleep(100);
System.out.println(Thread.currentThread().getName() + "**Daemon:" + Thread.currentThread().isDaemon());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new DaemonThreadDemo(), "thread" + i);
t.setDaemon(true);//daemon值要在线程启动之前设置
t.start();
}
System.out.println("all daemon thread start");
TimeUnit.MILLISECONDS.sleep(150);
}
}
输出结果:
all daemon thread start
thread1**Daemon:true
thread0**Daemon:true
thread4**Daemon:true
thread6**Daemon:true
thread2**Daemon:true
thread3**Daemon:true
thread5**Daemon:true
thread7**Daemon:true
thread8**Daemon:true
thread9**Daemon:true
2.1.1、结果说明
创建了10个后台线程,每个后台线程都是死循环,但是主线程main在启动后休眠了150毫秒后终止,因为已经没有用户线程运行,只剩守护线程。调整主线程的休眠时间,例如修改为50毫秒,会发现只打印 all daemon thread start
2.2 示例2
public class DaemonThreadDemo2 implements Runnable {
private int num = 0;
public void run() {
while (true) {
Thread t = new Thread("thread" + num++);
System.out.println(t.getName() + ":" + t.isDaemon());
}
}
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new DaemonThreadDemo2(), "I am a daemon thread");
t.setDaemon(true);//daemon值要在线程启动之前设置
t.start();
TimeUnit.MILLISECONDS.sleep(50);
}
}
输出结果:
thread0:true
thread1:true
thread2:true
thread3:true
thread4:true
thread5:true
.......
thread1031:true
thread1032:true
thread1033:true
thread1034:true
thread1035:true
2.2.1 结果说明:
所有由守护线程t创建的线程都是守护线程
三、总结
- 当没有非守护线程时,程序立即退出
- 由守护线程创建的线程,默认也都是守护线程
转载请注明作者及出处,并附上链接http://www.jianshu.com/u/ada8c4ee308b