1.什么是守护线程 ?什么是非守护线程?

守护线程 : JVM内部提供的线程(90%) + 用户自定义的守护线程。

非守护线程 :用户自定义的非守护线程。 非守护线程也就是普通线程 = 用户线程 。 如代码: Thread t1 = new Thread();

2.守护线程和非守护线程的区别是什么?

守护线程 :任何一个守护线程都是整个jvm中所有非守护线程的保姆或者称为守护者。

只要当前jvm实例中尚存任何一个非守护线程没有结束,守护线程就要全部工作;只有当最后一个非守护线程结束时,守护线程随着jvm一同结束工作。

守护线程最常见的例子便是GC(垃圾收集器),它就是一个很称职的守护者。

3.java中怎样将一个非守护线程,设置为守护线程?

Thread 类中有这么一个方法, 就是来将线程设置为守护线程
public final void setDaemon(boolean on) {
    checkAccess();
    // 判断当前的线程是否处于活动状态 
    if (isAlive()) {
        throw new IllegalThreadStateException();
    }
    daemon = on;
}

这里值得注意的便是,这个 if 判断。 若 当前 线程处于活动状态,强制将当前对象设置为守护线程/或非守护线程,那么都将会抛出异常。

所以错误的写法是:

Thread t1 = new Thread();
t1.start();
t1.setDaemon(true);

正确的写法因该是:

Thread t1 = new Thread();
t1.setDaemon(true);
t1.start();

在使用守护线程时,还要注意一个问题。只要当前jvm实例中所有的非守护线程执行完,JVM就会停止运行。

所以如果是业务操作且非特定场景下,尽量不要使用这个功能。以免造成严重的后果。

如下列例子,业务代码还没执行完,JVM已经停止运行了。

java中的守护线程-LMLPHP

07-05 17:27