2011-06-10 132 views

回答

4

守護進程線程和非守護進程線程之間的主要區別在於,當所有非守護進程線程都終止時,程序將終止。所以如果你有一個活動的守護進程線程並結束你的第一個線程,程序就會終止。所以,只要程序運行,你就會想要使用一個守護線程來保存你想要做的事情。

6

一個守護線程是一個線程,這並不妨礙JVM退出時程序完成,但線程仍在運行。 守護線程是服務供應商在同一個進程中守護線程

E.g垃圾收集運行的其他線程。

通過調用Thread對象上的setDaemon(true),可以明確指定用戶線程創建的線程爲守護進程線程。


供您參考,

注意,setDaemon()方法必須 線程的start() 方法之前被稱爲是一個invoked.Once線程 開始執行(即其start() 方法被稱爲)它的守護進程 狀態不能改變。若要確定 線程是否爲守護進程線程,請使用 訪問器方法isDaemon()

1

被視爲守護進程的線程會發生什麼情況?

標誌isDaemon()將被設置爲true。

什麼不會發生是;此線程不會停止應用程序退出。

這會對線程造成什麼影響?

沒有,除非你看isDaemon()方法。

線程上的「can and can'ts」是什麼?

你可以在守護線程中做任何事情,你可以在非守護線程中做任何事情。
你不能保證線程將完成。在Java的守護程序和非守護線程之間

0

差異:

1)JVM不會等待任何守護線程到現有之前完成。

2)當JVM終止時,守護線程與用戶線程的處理方式不同,最後阻塞不被調用,堆棧不會被解除並且JVM剛剛退出。

0

守護進程線程是一個不會阻止程序結束的線程。

舉個例子: Java應用程序開始與只有一個線程,則「」運行於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"); 
     } 
} 

嘗試運行上面的兩個不同的類,看看 輸出是如何不同。 守護進程線程的經典示例是在許多Java虛擬機中找到的垃圾回收線程。它需要在任何其他線程運行時連續運行,但不應阻止程序退出。程序退出時,不再需要垃圾收集器。