守护线程
守护线程
通常情况下,线程运行到最后一条指令后则完成生命周期,结束线程,然后系统回收资源。或者单遇到异常或者
守护线程和用户线程的区别
- 守护线程 是高优先级线程。
JVM 会在终止之前等待任何用户线程完成其任务。 - 用户线程 是低优先级线程。其唯一作用是为用户线程提供服务。
由于守护线程的作用是为用户线程提供服务,并且仅在用户线程运行时才需要,因此一旦所有用户线程完成执行,
这也是为什么我们并不推荐 在守护线程中执行
如何创建守护线程
守护线程也是一个线程,因此它的创建和启动其实和普通线程没什么区别?要将普通线程设置为守护线程,方法很简单,只需要调用
NewThread daemonThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
在
- 如果一个线程是普通线程( 用户线程) ,那么它创建的子线程默认也是普通线程( 用户线程
) 。 - 如果一个线程是守护线程,那么它创建的子线程默认也是守护线程。
因此,我们可以推演出: 由于主线程是用户线程,因此在 main()
方法内创建的任何线程默认为用户线程。
需要注意的是调用 setDaemon()
方法的时机,该方法只能在创建setDaemon()
将抛出
@Test(expected = IllegalThreadStateException.class)
public void whenSetDaemonWhileRunning_thenIllegalThreadStateException() {
NewThread daemonThread = new NewThread();
daemonThread.start();
daemonThread.setDaemon(true);
}
如何检查一个线程是守护线程还是用户线程?
检查一个线程是否是守护线程,可以简单地调用方法
@Test
public void whenCallIsDaemon_thenCorrect() {
NewThread daemonThread = new NewThread();
NewThread userThread = new NewThread();
daemonThread.setDaemon(true);
daemonThread.start();
userThread.start();
assertTrue(daemonThread.isDaemon());
assertFalse(userThread.isDaemon());
}