[英]java threading - Daemon thread?
被視為守護進程的線程會發生什么?
這對線程有什么影響?
線程上的“可以和不能”是什么?
守護線程是一個線程,當程序完成但線程仍在運行時,它不會阻止 JVM 退出。 守護線程是與守護線程在同一進程中運行的其他線程的服務提供者
例如垃圾收集。
您可以通過在線程 object 上調用setDaemon(true)
將用戶線程創建的線程顯式指定為守護線程。
供你參考,
注意
setDaemon()
方法必須在線程的start()
方法被調用之前被調用。一旦線程開始執行(即,它的start()
方法已經被調用),它的守護進程狀態就不能改變。 要確定線程是否為守護線程,請使用訪問器方法isDaemon()
。
守護線程和非守護線程之間的主要區別在於,當所有非守護線程都終止時,程序才會終止。 因此,如果您有一個活動的守護線程並結束您的第一個線程,程序就會終止。 因此,只要程序正在運行,您就希望將守護線程用於您想要繼續執行的操作。
被視為守護進程的線程會發生什么?
標志isDaemon()
將設置為 true。
不會發生的是; 該線程不會阻止應用程序退出。
這對線程有什么影響?
除非您查看 isDaemon() 方法,否則什么都沒有。
線程上的“可以和不能”是什么?
您可以在守護線程中執行任何您可以在非守護線程中執行的操作。
你不能保證線程會完成。
Java中守護線程和非守護線程的區別:
1) JVM 在存在之前不會等待任何守護線程完成。
2) 當 JVM 終止時,守護進程線程與用戶線程的處理方式不同,最終不調用塊,不解開堆棧,並且 JVM 剛剛退出。
守護線程是一個不會阻止程序結束的線程。
舉個例子:Java 應用程序從一個線程開始,即運行main
方法的“ main ”線程。 這是一個常規(非守護程序)線程。 現在再次想象程序啟動另一個線程,該線程位於循環中做某事。 如果新線程是常規(非守護程序)線程,它將阻止程序在“main”結束時完成,並永遠繼續下去!
class HelloThread extends Thread
{
public void run()
{
for ( ; ; )
{
System.out.println("hello");
sleep(1000);
}
}
}
public class RegularThreader
{
public static void main(String[] args)
{
Thread hello = new HelloThread();
hello.start();
System.out.println("Sorry, I must be leaving");
}
}
現在,這並不總是需要的。 有時您想在程序完成時結束此“后台”處理。 為此,您可以將線程標記為守護線程。 守護線程不會阻止程序結束,而是在主線程停止時停止
public class DaemonThreader
{
public static void main(String[] args)
{
Thread hello = new HelloThread();
hello.setDaemon(true);
hello.start();
System.out.println("Sorry, I must be leaving");
}
}
嘗試運行上面兩個不同的類,看看 output 有何不同。 守護線程的一個典型示例是在許多 Java 虛擬機中發現的垃圾收集器線程。 它需要在任何其他線程運行時連續運行,但不應阻止程序退出。 當程序退出時,不再需要垃圾收集器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.