您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關java及python中如何守護線程Daemon,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
1.所謂守護線程就是運行在程序后臺的線程,程序的主線程Main(比方java程序一開始啟動時創建的那個線程)不會是守護線程. 2.Daemon thread在Java里面的定義是,如果虛擬機中只有Daemon thread 在運行,則虛擬機退出。
虛擬機中可能會同時有很多個線程在運行,只有當所有的非守護線程都結束的時候,虛擬機的進程才會結束,不管在運行的線程是不是main()線程。3.Main主線程結束了(Non-daemon thread),如果此時正在運行的其他threads是daemon threads,JVM會使得這個threads停止,JVM也停下.
如果此時正在運行的其他threads有Non-daemon threads,那么必須等所有的Non daemon線程結束了,JVM才會停下來.4.總之,必須等所有的Non-daemon線程都運行結束了,只剩下daemon的時候,JVM才會停下來,注意Main主程序是Non-daemon線程. public class A
implements Runnable{
public void run() { for(;;){ System.out.println("hello world"); } } public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub Thread thread = new Thread(new A()); //thread.setDaemon(true);
//設置為守護進程thread.start(); Thread.sleep(3000); } }
source:http://www.fu-he.com/java/jishu_d.asp?id=3823
后臺線程與setDaemon()方法
核心提示:對Java程序來說,只要還有一個前臺線程在運行,這個進程就不會結束,如果一個進程中只有后臺線程在運行,這個進程就會結束。前臺線程是相對后臺線程而言的,前面所介紹的線程都是前臺線程。那么什么樣的線程是后臺線程呢?如果某個線程對象在啟動(調用start()方法)之前調用了setDaemon(true)方法,這個線程就變成了后臺線程。下面來看一下進程中只有后臺線程在運行的情況,如下所示:范例:Threa... |
對Java程序來說,只要還有一個前臺線程在運行,這個進程就不會結束,如果一個進程中只有后臺線程在運行,這個進程就會結束。前臺線程是相對后臺線程而言的,前面所介紹的線程都是前臺線程。那么什么樣的線程是后臺線程呢?如果某個線程對象在啟動(調用start()方法)之前調用了setDaemon(true)方法,這個線程就變成了后臺線程。下面來看一下進程中只有后臺線程在運行的情況,如下所示: 范例:ThreadDaemon.java 01 public class ThreadDaemon 02 { 03 public static void main(String args[]) 04 { 05 ThreadTest t = new ThreadTest() ; 06 Thread tt = new Thread(t) ; 07 tt.setDaemon(true) ; // 設置后臺運行 08 tt.start(); 09 } 10 } 11 12 class ThreadTest implements Runnable 13 { 14 public void run() 15 { 16 while(true) 17 { 18 System.out.println(Thread.currentThread().getName()+"is running."); 19 } 20 } 21 } 從上面的程序和運行結果(圖9-4)上,可以看到:雖然創建了一個無限循環的線程,但因為它是后臺線程,整個進程在主線程結束時就隨之終止運行了。這驗證了 進程中只有后臺線程運行時,進程就會結束的說法。 1. setDaemon需要在start方法調用之前使用 2. 線程劃分為用戶線程和后臺(daemon)進程,setDaemon將線程設置為后臺進程 3. 如果jvm中都是后臺進程,當前jvm將exit。(隨之而來的,所有的一切煙消云散,包括后臺線程啦) 4. 主線程結束后, 1) 用戶線程將會繼續運行 2) 如果沒有用戶線程,都是后臺進程的話,那么jvm結束
另外: setDaemon方法把java的線程設置為守護線程,此方法的調用必須在線程啟動之前執行。只有在當前jvm中所有的線程都為守護線程時,jvm才會退出。 實例如下: package com.jack.mySample;
補充說明: 定義:守護線程--也稱“服務線程”,在沒有用戶線程可服務時會自動離開。 優先級:守護線程的優先級比較低,用于為系統中的其它對象和線程提供服務。 設置:通過setDaemon(true)來設置線程為“守護線程”;將一個用戶線程設置為 守護線程的方式是在 線程對象創建 之前 用線程對象的setDaemon方法。 example: 垃圾回收線程就是一個經典的守護線程,當我們的程序中不再有任何運行的 Thread,程序就不會再產生垃圾,垃圾回收器也就無事可做,所以當垃圾回收線程是 JVM上僅剩的線程時,垃圾回收線程會自動離開。它始終在低級別的狀態中運行,用于 實時監控和管理系統中的可回收資源。 生命周期:守護進程(Daemon)是運行在后臺的一種特殊進程。它獨立于控制終端并且 周期性地執行某種任務或等待處理某些發生的事件。也就是 說守護線程不依賴于終端,但是依賴于系統,與系統“同生共死”。那Java的守護線程是 什么樣子的呢。當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個 或以上的非守護線程則JVM不會退出。 初次碰到這個方法,就被這個怪里怪氣的拼寫單詞懵了下,查API又覺得理解得不深刻,那還是查下Daemon這個詞有什么意思,什么詞源吧。Daemon 中的 ae 為一個音,重音在 /di:/ 上,好象是指希臘守護神的意思吧。在計算機專業英語中是守護線程的意思。原以為如果一個線程被光榮地定義為守護線程,一定會直到進程運行到最后一刻,但真錯了,如果一個線程是守護線程,那么,主線程運行結束時,如果沒有任何非守護線程在運行,守護線程就會自盡了。
import java.io.IOException; class TestMain4 extends Thread { public static void main(String [] args){ |
關于java及python中如何守護線程Daemon就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。