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() |
用於檢查當前是守護行程。 |
檔案:TestDaemonThread1.java
package com.yiibai;
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
。
檔案:TestDaemonThread2.java
package com.yiibai;
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)