Java守護線程
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.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)