linux下:
守护(Daemon)进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
守护线程在没有用户线程可服务时自动离开,在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。
典型例子:
JVM中的系统资源自动回收线程,我们所熟悉的Java垃圾回收线程就是一个典型的守护线程, 当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
最通俗的说法:
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。
那Java的守护线程是什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;
守护线程需要注意点:
(1)thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2)在Daemon线程中产生的新线程也是Daemon的。
(3)不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。 (不能保证,当用户进程都退出了,守护进程的 读写任务是否完成,即使没有完成,守护进程也会自动退出)
上面内容地址:https://www.cnblogs.com/NeilZhang/p/7087399.html
源码实战
public class Test {
public static void main(String[] args) {
Thread t1 = new MyCommon();
Thread t2 = new MyDaemon();
t2.setDaemon(true);
t2.start();
t1.start();
}
}
class MyCommon extends Thread {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("线程1第"+i+"次执行!");
/*try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }*/
}
}
}
class MyDaemon extends Thread {
@Override
public void run() {
for (int i = 0; i < 9999999L; i++) {
System.out.println("守护线程===第"+i+"次执行!");
/*try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); }*/
}
}
}
上面源码说明
1.最开始MyCommon 、MyDaemon 都是main中的一个线程
2.MyDaemon 设置了守护线程
3.也就是main方法跑完,就意味应用程序结束,而守护线程MyDaemon 的对象也会结束
4.而main方法跑完就取决于MyCommon 跑完,如果main中的程序或者分支没有跑完,MyDaemon的守护线程是不会结束,而是一直存在jvm。假设如果for (int i = 0; i < 9999999L; i++) {中的9999999L变成3或者其他数字也是一样的。无非是没有什么东西打印显示而已。