Java 简明教程
Java - Daemon Thread
Daemon Thread in Java
为了支持用户线程,创建一个守护线程。它通常在后台工作,在所有其他线程关闭后终止。垃圾收集器就是守护线程的一个示例。
A Daemon thread is created to support the user threads. It generallty works in background and terminated once all the other threads are closed. Garbage collector is one of the example of Daemon thread.
Characteristics of a Daemon Thread in Java
-
A Daemon thread is a low priority thread.
-
A Daemon thread is a service provider thread and should not be used as user thread.
-
JVM automatically closes the daemon thread(s) if no active thread is present and revives it if user threads are active again.
-
A daemon thread cannot prevent JVM to exit if all user threads are done.
Thread Class Methods for Java Daemon Thread
以下是 Thread class 在 Java 中为守护线程提供的使用方法 -
The following are the methods provided by the Thread class for Daemon Thread in Java -
-
Thread.setDaemon() Method: Marks this thread as either a daemon thread or a user thread.
-
Thread.isDaemon() Method: Checks if this thread is a daemon thread.
Example of Java Daemon Thread
在此示例中,我们创建了一个扩展 Thread 类的 ThreadDemo 类。在 main 方法中,我们创建了三个线程。由于我们未将任何线程设置为守护线程,因此没有线程被标记为守护线程。
In this example, we’ve created a ThreadDemo class which extends Thread class. In main method, we’ve created three threads. As we’re not setting any thread as daemon thread, no thread is marked as daemon thread.
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
More Example of Java Daemon Thread
Example 1
在此示例中,我们创建了一个扩展 Thread 类的 ThreadDemo 类。在 main 方法中,我们创建了三个线程。由于我们将一个线程设置为守护线程,因此一个线程将打印为守护线程。
In this example, we’ve created a ThreadDemo class which extends Thread class. In main method, we’ve created three threads. As we’re setting one thread as daemon thread, one thread will be printed as daemon thread.
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
Example 2
在此示例中,我们创建了一个扩展 Thread 类的 ThreadDemo 类。在 main 方法中,我们创建了三个线程。线程一旦启动,便无法将其设置为守护线程。由于我们在线程启动之后将其设置为守护线程,因此会引发运行时异常。
In this example, we’ve created a ThreadDemo class which extends Thread class. In main method, we’ve created three threads. Once a thread starts, it cannot be set as daemon thread. As we’re setting one thread as daemon thread after it started, a runtime exception will be raised.
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)