守护线程
程序员文章站
2022-05-05 21:37:50
...
线程分为用户线程和守护线程
守护线程:用来服务于用户线程
创建守护线程只需要将deamon设置为true,创建线程时deamon默认是false
public class DeamonThread {
public static void main(String[] args) throws Exception{
Thread t = new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// main的生命周期结束,t线程也跟着结束
// setDaemon必须在start之前设置,如果在start之后设置会抛出异常
t.setDaemon(true);
t.start();
Thread.sleep(10000);
System.out.println(Thread.currentThread().getName());
}
}
结论:当线程只剩下守护线程的时候,JVM就会退出
在线程中创建新的线程,如果自线程不是守护线程
public class DeamonThread2 {
public static void main(String[] args) throws Exception{
Thread t =
new Thread(
() -> {
Thread innerThread =
new Thread(
() -> {
try {
while (true) {
System.out.println("do some things for health ");
Thread.sleep(1_000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 如果不设置成守护线程 就一直死循环下去
/**
* do some things for health
* mainfinished done
* do some things for health
* do some
* things for health
* do some things for health do some things for health
*/
// innerThread.setDaemon(true);
innerThread.start();
});
// t.setDaemon(true);
t.start();
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"finished done");
}
}
innerThread.setDaemon(false)将会无限循下去
注意要点:
- thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常
- 守护线程中创建的线程也是守护线程,上边的案例中可以t.setDaemon(true);把这个注释放开体验一下.
- 守护线程不能用于去访问固有资源,比如读写操作或者计算逻辑,守护线程可能随时中断
上一篇: 超级详细的创建maven项目教程
下一篇: IDEA中创建web的Maven项目