Java教程-Java中的守护线程

Java中的守护线程
Java中的守护线程是为用户线程提供服务的线程。它的生命周期取决于用户线程,即当所有用户线程结束时,JVM会自动终止守护线程。
Java中有许多自动运行的守护线程,例如垃圾回收器(gc)、finalizer等。
您可以在命令提示符中输入jconsole来查看所有详细信息。jconsole工具提供有关加载的类、内存使用情况、运行的线程等信息。
Java中守护线程的要点
- 它为后台支持任务的用户线程提供服务,除了为用户线程提供服务外,它没有其他生命周期。
- 它的生命周期依赖于用户线程。
- 它是低优先级线程。
为什么JVM在没有用户线程时会终止守护线程?
守护线程的唯一目的是为用户线程提供后台支持任务的服务。如果没有用户线程,为什么JVM要继续运行这个线程。因此,如果没有用户线程,JVM会终止守护线程。
Thread类提供的Java守护线程方法
java.lang.Thread类提供了两个方法用于Java守护线程。
No. | 方法 | 描述 |
---|---|---|
1) | public void setDaemon(boolean status) | 用于将当前线程标记为守护线程或用户线程。 |
2) | public boolean isDaemon() | 用于检查当前是否是守护进程。 |
在Java中的守护线程的简单示例
文件:MyThread.java
public class TestDaemonThread1 extends Thread{
public void run(){
if(Thread.currentThread().isDaemon()){//检查守护线程
System.out.println("daemon thread work");
}
else{
System.out.println("user thread work");
}
}
public static void main(String[] args){
TestDaemonThread1 t1=new TestDaemonThread1();//创建线程
TestDaemonThread1 t2=new TestDaemonThread1();
TestDaemonThread1 t3=new TestDaemonThread1();
t1.setDaemon(true);//现在t1是守护线程
t1.start();//启动线程
t2.start();
t3.start();
}
}
输出:
daemon thread work
user thread work
user thread work
注意:如果您想将用户线程设置为守护线程,必须在启动之前进行设置,否则会抛出IllegalThreadStateException。
文件:MyThread.java
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);//将在此处抛出异常
t2.start();
}
}
输出:
exception in thread main: java.lang.IllegalThreadStateException