线程同步基础——守护线程的使用
目录
守护线程的例子分享
Daemon Thread概念
守护线程通常执行一些特殊任务,当所有用户线程终止的时候,JVM会简单的丢弃掉所有现存的守护线程.一旦其它非守护线程执行完就会丢弃,不一定所有的守护线程都会执行完才退出,它们可能在非守护线程执行完后的某个时刻就会退出.
代码例子
此例子模拟了一个子线程守护主线程的场景,当主线程执行完毕后,不论守护线程是否执行完毕,都将被停止执行。
public class DaemonThread {
public static void main(String[] args) {
//模拟主线程--用户线程
Thread thread = new Thread(
new Runnable() {
@Override
public void run() {
//钩子函数监控JVM变化
Runtime.getRuntime().addShutdownHook(new Thread(()->System.out.println("JVM exists")));
System.out.println(Thread.currentThread().getName()+":启动成功");
//模拟子线程--守护线程
Thread thread = new Thread(
new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":启动成功");
for (int i = 0; i < 1000000; i++) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
System.out.println(Thread.currentThread().getName()+":关闭成功");
}
}
);
thread.setName("子线程--守护线程");
thread.setDaemon(true);
thread.start();
int count = 0;
while(true) {
//模拟执行任务
try {
Thread.sleep(1000);
count ++;
if(count > 10) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":执行成功,count:"+count);
}
System.out.println(Thread.currentThread().getName()+":关闭成功");
}
}
);
thread.setName("主线程--用户线程");
thread.start();
}
}