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已经停止运行了。