溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java及python中如何守護(hù)線(xiàn)程Daemon

發(fā)布時(shí)間:2021-10-14 15:23:07 來(lái)源:億速云 閱讀:125 作者:柒染 欄目:編程語(yǔ)言

這篇文章將為大家詳細(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ō)法。


source:http://blog.csdn.net/m13666368773/article/details/7245570 Thread.setDaemon的用法,經(jīng)過(guò)學(xué)習(xí)以后了解:

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ì)退出。

如果創(chuàng)建的線(xiàn)程沒(méi)有顯示調(diào)用此方法,這默認(rèn)為用戶(hù)線(xiàn)程。

實(shí)例如下:

package com.jack.mySample;   

  

import java.io.IOException;   

  

public class TestThread extends Thread {   

       

    public TestThread() {   

    }   

    /** *//**  

     * 線(xiàn)程的run方法,它將和其他線(xiàn)程同時(shí)運(yùn)行  

     */  

    public void run(){   

        for(int i = 1; i <= 100; i++){   

            try{   

                Thread.sleep(100);   

                   

            } catch (InterruptedException ex){   

                ex.printStackTrace();   

            }   

            System.out.println(i);   

        }   

    }   

    public static void main(String [] args){   

        TestThread test = new TestThread();   

        // 如果不設(shè)置daemon,那么線(xiàn)程將輸出100后才結(jié)束   

        test.setDaemon(true);   

        test.start();   

        System.out.println("isDaemon = " + test.isDaemon());   

        try {   

            System.in.read(); // 接受輸入,使程序在此停頓,一旦接收到用戶(hù)輸入,main線(xiàn)程結(jié)束,守護(hù)線(xiàn)程自動(dòng)結(jié)束   

        } catch (IOException ex) {   

            ex.printStackTrace();   

        }   

    }   

 

補(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ì)自盡了。
setDaemon方法是Thread中的方法,默認(rèn)為false狀態(tài),將該線(xiàn)程標(biāo)記為守護(hù)線(xiàn)程或用戶(hù)線(xiàn)程,該方法必須在啟動(dòng)線(xiàn)程前調(diào)用,具有最低的優(yōu)先級(jí),讓系統(tǒng)資源優(yōu)先調(diào)用其他線(xiàn)程。當(dāng)正在運(yùn)行的線(xiàn)程都是守護(hù)線(xiàn)程時(shí),Java 虛擬機(jī)退出。


如下邊這個(gè)小程序如示:

import java.io.IOException;

class TestMain4 extends Thread {
   public void run() {            //永真循環(huán)線(xiàn)程
       for(int i=0;;i++){
           try {
               Thread.sleep(1000);
           } catch (InterruptedException ex) {   }
           System.out.println(i);
       }
   }

   public static void main(String [] args){
      TestMain4 test = new TestMain4();
      test.setDaemon(true);    //調(diào)試時(shí)可以設(shè)置為false,那么這個(gè)程序是個(gè)死循環(huán),沒(méi)有退出條件。設(shè)置為true,即可主線(xiàn)程結(jié)束,test線(xiàn)程也結(jié)束。
       test.start();
       System.out.println("isDaemon = " + test.isDaemon());
       try {
           System.in.read();   // 接受輸入,使程序在此停頓,一旦接收到用戶(hù)輸入,main線(xiàn)程結(jié)束,守護(hù)線(xiàn)程自動(dòng)結(jié)束
       } catch (IOException ex) {}
   }
}


關(guān)于java及python中如何守護(hù)線(xiàn)程Daemon就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI