您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)java及python中如何守護(hù)線(xiàn)程Daemon,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
1.所謂守護(hù)線(xiàn)程就是運(yùn)行在程序后臺(tái)的線(xiàn)程,程序的主線(xiàn)程Main(比方j(luò)ava程序一開(kāi)始啟動(dòng)時(shí)創(chuàng)建的那個(gè)線(xiàn)程)不會(huì)是守護(hù)線(xiàn)程. 2.Daemon thread在Java里面的定義是,如果虛擬機(jī)中只有Daemon thread 在運(yùn)行,則虛擬機(jī)退出。
虛擬機(jī)中可能會(huì)同時(shí)有很多個(gè)線(xiàn)程在運(yùn)行,只有當(dāng)所有的非守護(hù)線(xiàn)程都結(jié)束的時(shí)候,虛擬機(jī)的進(jìn)程才會(huì)結(jié)束,不管在運(yùn)行的線(xiàn)程是不是main()線(xiàn)程。3.Main主線(xiàn)程結(jié)束了(Non-daemon thread),如果此時(shí)正在運(yùn)行的其他threads是daemon threads,JVM會(huì)使得這個(gè)threads停止,JVM也停下.
如果此時(shí)正在運(yùn)行的其他threads有Non-daemon threads,那么必須等所有的Non daemon線(xiàn)程結(jié)束了,JVM才會(huì)停下來(lái).4.總之,必須等所有的Non-daemon線(xiàn)程都運(yùn)行結(jié)束了,只剩下daemon的時(shí)候,JVM才會(huì)停下來(lái),注意Main主程序是Non-daemon線(xiàn)程. 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);
//設(shè)置為守護(hù)進(jìn)程thread.start(); Thread.sleep(3000); } }
source:http://www.fu-he.com/java/jishu_d.asp?id=3823
后臺(tái)線(xiàn)程與setDaemon()方法
核心提示:對(duì)Java程序來(lái)說(shuō),只要還有一個(gè)前臺(tái)線(xiàn)程在運(yùn)行,這個(gè)進(jìn)程就不會(huì)結(jié)束,如果一個(gè)進(jìn)程中只有后臺(tái)線(xiàn)程在運(yùn)行,這個(gè)進(jìn)程就會(huì)結(jié)束。前臺(tái)線(xiàn)程是相對(duì)后臺(tái)線(xiàn)程而言的,前面所介紹的線(xiàn)程都是前臺(tái)線(xiàn)程。那么什么樣的線(xiàn)程是后臺(tái)線(xiàn)程呢?如果某個(gè)線(xiàn)程對(duì)象在啟動(dòng)(調(diào)用start()方法)之前調(diào)用了setDaemon(true)方法,這個(gè)線(xiàn)程就變成了后臺(tái)線(xiàn)程。下面來(lái)看一下進(jìn)程中只有后臺(tái)線(xiàn)程在運(yùn)行的情況,如下所示:范例:Threa... |
對(duì)Java程序來(lái)說(shuō),只要還有一個(gè)前臺(tái)線(xiàn)程在運(yùn)行,這個(gè)進(jìn)程就不會(huì)結(jié)束,如果一個(gè)進(jìn)程中只有后臺(tái)線(xiàn)程在運(yùn)行,這個(gè)進(jìn)程就會(huì)結(jié)束。前臺(tái)線(xiàn)程是相對(duì)后臺(tái)線(xiàn)程而言的,前面所介紹的線(xiàn)程都是前臺(tái)線(xiàn)程。那么什么樣的線(xiàn)程是后臺(tái)線(xiàn)程呢?如果某個(gè)線(xiàn)程對(duì)象在啟動(dòng)(調(diào)用start()方法)之前調(diào)用了setDaemon(true)方法,這個(gè)線(xiàn)程就變成了后臺(tái)線(xiàn)程。下面來(lái)看一下進(jìn)程中只有后臺(tái)線(xiàn)程在運(yùn)行的情況,如下所示: 范例: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) ; // 設(shè)置后臺(tái)運(yùn)行 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 } 從上面的程序和運(yùn)行結(jié)果(圖9-4)上,可以看到:雖然創(chuàng)建了一個(gè)無(wú)限循環(huán)的線(xiàn)程,但因?yàn)樗呛笈_(tái)線(xiàn)程,整個(gè)進(jìn)程在主線(xiàn)程結(jié)束時(shí)就隨之終止運(yùn)行了。這驗(yàn)證了 進(jìn)程中只有后臺(tái)線(xiàn)程運(yùn)行時(shí),進(jìn)程就會(huì)結(jié)束的說(shuō)法。 1. setDaemon需要在start方法調(diào)用之前使用 2. 線(xiàn)程劃分為用戶(hù)線(xiàn)程和后臺(tái)(daemon)進(jìn)程,setDaemon將線(xiàn)程設(shè)置為后臺(tái)進(jìn)程 3. 如果jvm中都是后臺(tái)進(jìn)程,當(dāng)前jvm將exit。(隨之而來(lái)的,所有的一切煙消云散,包括后臺(tái)線(xiàn)程啦) 4. 主線(xiàn)程結(jié)束后, 1) 用戶(hù)線(xiàn)程將會(huì)繼續(xù)運(yùn)行 2) 如果沒(méi)有用戶(hù)線(xiàn)程,都是后臺(tái)進(jìn)程的話(huà),那么jvm結(jié)束
另外: setDaemon方法把java的線(xiàn)程設(shè)置為守護(hù)線(xiàn)程,此方法的調(diào)用必須在線(xiàn)程啟動(dòng)之前執(zhí)行。只有在當(dāng)前jvm中所有的線(xiàn)程都為守護(hù)線(xiàn)程時(shí),jvm才會(huì)退出。 實(shí)例如下: package com.jack.mySample;
補(bǔ)充說(shuō)明: 定義:守護(hù)線(xiàn)程--也稱(chēng)“服務(wù)線(xiàn)程”,在沒(méi)有用戶(hù)線(xiàn)程可服務(wù)時(shí)會(huì)自動(dòng)離開(kāi)。 優(yōu)先級(jí):守護(hù)線(xiàn)程的優(yōu)先級(jí)比較低,用于為系統(tǒng)中的其它對(duì)象和線(xiàn)程提供服務(wù)。 設(shè)置:通過(guò)setDaemon(true)來(lái)設(shè)置線(xiàn)程為“守護(hù)線(xiàn)程”;將一個(gè)用戶(hù)線(xiàn)程設(shè)置為 守護(hù)線(xiàn)程的方式是在 線(xiàn)程對(duì)象創(chuàng)建 之前 用線(xiàn)程對(duì)象的setDaemon方法。 example: 垃圾回收線(xiàn)程就是一個(gè)經(jīng)典的守護(hù)線(xiàn)程,當(dāng)我們的程序中不再有任何運(yùn)行的 Thread,程序就不會(huì)再產(chǎn)生垃圾,垃圾回收器也就無(wú)事可做,所以當(dāng)垃圾回收線(xiàn)程是 JVM上僅剩的線(xiàn)程時(shí),垃圾回收線(xiàn)程會(huì)自動(dòng)離開(kāi)。它始終在低級(jí)別的狀態(tài)中運(yùn)行,用于 實(shí)時(shí)監(jiān)控和管理系統(tǒng)中的可回收資源。 生命周期:守護(hù)進(jìn)程(Daemon)是運(yùn)行在后臺(tái)的一種特殊進(jìn)程。它獨(dú)立于控制終端并且 周期性地執(zhí)行某種任務(wù)或等待處理某些發(fā)生的事件。也就是 說(shuō)守護(hù)線(xiàn)程不依賴(lài)于終端,但是依賴(lài)于系統(tǒng),與系統(tǒng)“同生共死”。那Java的守護(hù)線(xiàn)程是 什么樣子的呢。當(dāng)JVM中所有的線(xiàn)程都是守護(hù)線(xiàn)程的時(shí)候,JVM就可以退出了;如果還有一個(gè) 或以上的非守護(hù)線(xiàn)程則JVM不會(huì)退出。 初次碰到這個(gè)方法,就被這個(gè)怪里怪氣的拼寫(xiě)單詞懵了下,查API又覺(jué)得理解得不深刻,那還是查下Daemon這個(gè)詞有什么意思,什么詞源吧。Daemon 中的 ae 為一個(gè)音,重音在 /di:/ 上,好象是指希臘守護(hù)神的意思吧。在計(jì)算機(jī)專(zhuān)業(yè)英語(yǔ)中是守護(hù)線(xiàn)程的意思。原以為如果一個(gè)線(xiàn)程被光榮地定義為守護(hù)線(xiàn)程,一定會(huì)直到進(jìn)程運(yùn)行到最后一刻,但真錯(cuò)了,如果一個(gè)線(xiàn)程是守護(hù)線(xiàn)程,那么,主線(xiàn)程運(yùn)行結(jié)束時(shí),如果沒(méi)有任何非守護(hù)線(xiàn)程在運(yùn)行,守護(hù)線(xiàn)程就會(huì)自盡了。
import java.io.IOException; class TestMain4 extends Thread { public static void main(String [] args){ |
關(guān)于java及python中如何守護(hù)線(xiàn)程Daemon就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。