java中的守护程序线程是一个服务提供程序线程,它为用户线程提供服务。 它的生命依赖于用户线程,即当所有用户线程都死掉时,JVM会自动终止该线程。
有许多java守护程序线程自动运行,例如 gc
,finalizer
等
通过在命令提示符下键入jconsole
来查看所有详细信息。 jconsole
工具提供有关已加载类,内存使用情况,运行线程等的信息。
Java中的守护程序线程的要点
- 它为用户线程提供后台支持任务的服务。它在生命中没有为服务用户线程而发挥作用。
- 它的生命取决于用户线程。
- 它是一个低优先级的线程。
如果没有用户线程,为什么JVM会终止守护程序线程?
守护程序线程的唯一目的是它为用户线程提供后台支持任务的服务。 如果没有用户线程,为什么JVM要继续运行这个线程?这就是为什么JVM在没有用户线程的情况下终止守护进程线程的原因。
Thread类的Java守护程序线程的方法
java.lang.Thread
类为java守护程序线程提供了两种方法。
编号 | 方法 | 描述 |
1 | public void setDaemon(boolean status) | 用于将当前线程标记为守护程序线程或用户线程。 |
2 | public boolean isDaemon() |
用于检查当前是守护进程。 |
Java中守护程序线程的简单示例
文件:TestDaemonThread1.java
package com.example.thread; public class TestDaemonThread1 extends Thread { public void run() { if (Thread.currentThread().isDaemon()) {// checking for daemon thread System.out.println("daemon thread work"); } else { System.out.println("user thread work"); } } public static void main(String[] args) { TestDaemonThread1 t1 = new TestDaemonThread1();// creating thread TestDaemonThread1 t2 = new TestDaemonThread1(); TestDaemonThread1 t3 = new TestDaemonThread1(); t1.setDaemon(true);// now t1 is daemon thread t1.start();// starting threads t2.start(); t3.start(); } }
输出
daemon thread work
user thread work
user thread work
注意: 如果要将用户线程设置为守护进程,则不能启动它,否则将抛出
IllegalThreadStateException
。package com.example.thread; class TestDaemonThread2 extends Thread { public void run() { System.out.println("Name: " + Thread.currentThread().getName()); System.out.println("Daemon: " + Thread.currentThread().isDaemon()); } public static void main(String[] args) { TestDaemonThread2 t1 = new TestDaemonThread2(); TestDaemonThread2 t2 = new TestDaemonThread2(); t1.start(); t1.setDaemon(true);// will throw exception here t2.start(); } }
Exception in thread "main" Name: Thread-0 Daemon: false java.lang.IllegalThreadStateException at java.lang.Thread.setDaemon(Unknown Source) at com.yiibai.TestDaemonThread2.main(TestDaemonThread2.java:13)
https://www.yiibai.com/java_multithreading/daemon-thread.html