簡體   English   中英

java 線程 - 守護線程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM