守护线程是为了支持用户线程而创建的。它通常在后台工作,并在所有其他线程关闭后终止。垃圾收集器就是一个守护线程的例子。
Java 中守护线程的特点
-
-
守护线程是一个服务提供者线程,不应该作为用户线程使用。
-
如果没有活动的线程存在,JVM 会自动关闭守护线程,并且如果用户线程再次活跃则重新激活它。
-
如果所有用户线程都已完成,守护线程无法阻止 JVM 退出。
Java 守护线程的 Thread
类方法
以下是 Thread
类提供的用于 Java 守护线程的方法:
-
Thread.setDaemon()
方法:标记此线程为守护线程或用户线程。
-
Thread.isDaemon()
方法:检查此线程是否为守护线程。
Java 守护线程示例
在这个例子中,我们创建了一个扩展 Thread
类的 ThreadDemo
类。在 main
方法中,我们创建了三个线程。由于我们没有将任何线程设置为守护线程,因此没有任何线程被标记为守护线程。
package com.tutorialspoint;
class ThreadDemo extends Thread {
ThreadDemo( ) {
}
public void run() {
System.out.println("Thread " + Thread.currentThread().getName()
+ ", is Daemon: " + Thread.currentThread().isDaemon());
}
public void start () {
super.start();
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo thread1 = new ThreadDemo();
ThreadDemo thread2 = new ThreadDemo();
ThreadDemo thread3 = new ThreadDemo();
thread1.start();
thread2.start();
thread3.start();
}
}
输出
Thread Thread-1, is Daemon: false
Thread Thread-0, is Daemon: false
Thread Thread-2, is Daemon: false
更多 Java 守护线程示例
示例 1
在这个例子中,我们创建了一个扩展 Thread
类的 ThreadDemo
类。在 main
方法中,我们创建了三个线程。由于我们将其中一个线程设置为守护线程,因此一个线程将被打印为守护线程。
package com.tutorialspoint;
class ThreadDemo extends Thread {
ThreadDemo( ) {
}
public void run() {
System.out.println("Thread " + Thread.currentThread().getName()
+ ", is Daemon: " + Thread.currentThread().isDaemon());
}
public void start () {
super.start();
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo thread1 = new ThreadDemo();
ThreadDemo thread2 = new ThreadDemo();
ThreadDemo thread3 = new ThreadDemo();
thread3.setDaemon(true);
thread1.start();
thread2.start();
thread3.start();
}
}
输出
Thread Thread-1, is Daemon: false
Thread Thread-2, is Daemon: true
Thread Thread-0, is Daemon: false
示例 2
在这个例子中,我们创建了一个扩展 Thread
类的 ThreadDemo
类。在 main
方法中,我们创建了三个线程。一旦线程开始后,就不能再将其设置为守护线程。由于我们在线程启动后尝试将其设置为守护线程,将会抛出运行时异常。
package com.tutorialspoint;
class ThreadDemo extends Thread {
ThreadDemo( ) {
}
public void run() {
System.out.println("Thread " + Thread.currentThread().getName()
+ ", is Daemon: " + Thread.currentThread().isDaemon());
}
public void start () {
super.start();
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo thread1 = new ThreadDemo();
ThreadDemo thread2 = new ThreadDemo();
ThreadDemo thread3 = new ThreadDemo();
thread1.start();
thread2.start();
thread3.start();
thread3.setDaemon(true);
}
}
输出
Exception in thread "main" Thread Thread-1, is Daemon: false
Thread Thread-2, is Daemon: false
Thread Thread-0, is Daemon: false
java.lang.IllegalThreadStateException
at java.lang.Thread.setDaemon(Unknown Source)
at com.tutorialspoint.TestThread.main(TestThread.java:27)