欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

這篇文章將為大家詳細(xì)講解有關(guān)java及python中如何守護(hù)線程Daemon,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),綏中企業(yè)網(wǎng)站建設(shè),綏中品牌網(wǎng)站建設(shè),網(wǎng)站定制,綏中網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,綏中網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1.所謂守護(hù)線程就是運(yùn)行在程序后臺(tái)的線程,程序的主線程Main(比方j(luò)ava程序一開(kāi)始啟動(dòng)時(shí)創(chuàng)建的那個(gè)線程)不會(huì)是守護(hù)線程. 2.Daemon thread在Java里面的定義是,如果虛擬機(jī)中只有Daemon thread 在運(yùn)行,則虛擬機(jī)退出。 

 虛擬機(jī)中可能會(huì)同時(shí)有很多個(gè)線程在運(yùn)行,只有當(dāng)所有的非守護(hù)線程都結(jié)束的時(shí)候,虛擬機(jī)的進(jìn)程才會(huì)結(jié)束,不管在運(yùn)行的線程是不是main()線程。3.Main主線程結(jié)束了(Non-daemon thread),如果此時(shí)正在運(yùn)行的其他threads是daemon threads,JVM會(huì)使得這個(gè)threads停止,JVM也停下.  

 如果此時(shí)正在運(yùn)行的其他threads有Non-daemon threads,那么必須等所有的Non daemon線程結(jié)束了,JVM才會(huì)停下來(lái).4.總之,必須等所有的Non-daemon線程都運(yùn)行結(jié)束了,只剩下daemon的時(shí)候,JVM才會(huì)停下來(lái),注意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);  

 //設(shè)置為守護(hù)進(jìn)程thread.start(); Thread.sleep(3000); } }

source:http://www.fu-he.com/java/jishu_d.asp?id=3823

后臺(tái)線程與setDaemon()方法

核心提示:對(duì)Java程序來(lái)說(shuō),只要還有一個(gè)前臺(tái)線程在運(yùn)行,這個(gè)進(jìn)程就不會(huì)結(jié)束,如果一個(gè)進(jìn)程中只有后臺(tái)線程在運(yùn)行,這個(gè)進(jìn)程就會(huì)結(jié)束。前臺(tái)線程是相對(duì)后臺(tái)線程而言的,前面所介紹的線程都是前臺(tái)線程。那么什么樣的線程是后臺(tái)線程呢?如果某個(gè)線程對(duì)象在啟動(dòng)(調(diào)用start()方法)之前調(diào)用了setDaemon(true)方法,這個(gè)線程就變成了后臺(tái)線程。下面來(lái)看一下進(jìn)程中只有后臺(tái)線程在運(yùn)行的情況,如下所示:范例:Threa...

對(duì)Java程序來(lái)說(shuō),只要還有一個(gè)前臺(tái)線程在運(yùn)行,這個(gè)進(jìn)程就不會(huì)結(jié)束,如果一個(gè)進(jìn)程中只有后臺(tái)線程在運(yùn)行,這個(gè)進(jìn)程就會(huì)結(jié)束。前臺(tái)線程是相對(duì)后臺(tái)線程而言的,前面所介紹的線程都是前臺(tái)線程。那么什么樣的線程是后臺(tái)線程呢?如果某個(gè)線程對(duì)象在啟動(dòng)(調(diào)用start()方法)之前調(diào)用了setDaemon(true)方法,這個(gè)線程就變成了后臺(tái)線程。下面來(lái)看一下進(jìn)程中只有后臺(tái)線程在運(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)的線程,但因?yàn)樗呛笈_(tái)線程,整個(gè)進(jìn)程在主線程結(jié)束時(shí)就隨之終止運(yùn)行了。這驗(yàn)證了

進(jìn)程中只有后臺(tái)線程運(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. 線程劃分為用戶(hù)線程和后臺(tái)(daemon)進(jìn)程,setDaemon將線程設(shè)置為后臺(tái)進(jìn)程

3. 如果jvm中都是后臺(tái)進(jìn)程,當(dāng)前jvm將exit。(隨之而來(lái)的,所有的一切煙消云散,包括后臺(tái)線程啦)

4. 主線程結(jié)束后,

      1) 用戶(hù)線程將會(huì)繼續(xù)運(yùn)行

      2) 如果沒(méi)有用戶(hù)線程,都是后臺(tái)進(jìn)程的話,那么jvm結(jié)束

 

另外:

setDaemon方法把java的線程設(shè)置為守護(hù)線程,此方法的調(diào)用必須在線程啟動(dòng)之前執(zhí)行。只有在當(dāng)前jvm中所有的線程都為守護(hù)線程時(shí),jvm才會(huì)退出。

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

實(shí)例如下:

package com.jack.mySample;   

  

import java.io.IOException;   

  

public class TestThread extends Thread {   

       

    public TestThread() {   

    }   

    /** *//**  

     * 線程的run方法,它將和其他線程同時(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,那么線程將輸出100后才結(jié)束   

        test.setDaemon(true);   

        test.start();   

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

        try {   

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

        } catch (IOException ex) {   

            ex.printStackTrace();   

        }   

    }   

 

補(bǔ)充說(shuō)明:

定義:守護(hù)線程--也稱(chēng)“服務(wù)線程”,在沒(méi)有用戶(hù)線程可服務(wù)時(shí)會(huì)自動(dòng)離開(kāi)。

優(yōu)先級(jí):守護(hù)線程的優(yōu)先級(jí)比較低,用于為系統(tǒng)中的其它對(duì)象和線程提供服務(wù)。

設(shè)置:通過(guò)setDaemon(true)來(lái)設(shè)置線程為“守護(hù)線程”;將一個(gè)用戶(hù)線程設(shè)置為

      守護(hù)線程的方式是在 線程對(duì)象創(chuàng)建 之前 用線程對(duì)象的setDaemon方法。

example: 垃圾回收線程就是一個(gè)經(jīng)典的守護(hù)線程,當(dāng)我們的程序中不再有任何運(yùn)行的

      Thread,程序就不會(huì)再產(chǎn)生垃圾,垃圾回收器也就無(wú)事可做,所以當(dāng)垃圾回收線程是

      JVM上僅剩的線程時(shí),垃圾回收線程會(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ù)線程不依賴(lài)于終端,但是依賴(lài)于系統(tǒng),與系統(tǒng)“同生共死”。那Java的守護(hù)線程是

      什么樣子的呢。當(dāng)JVM中所有的線程都是守護(hù)線程的時(shí)候,JVM就可以退出了;如果還有一個(gè)

      或以上的非守護(hù)線程則JVM不會(huì)退出。

初次碰到這個(gè)方法,就被這個(gè)怪里怪氣的拼寫(xiě)單詞懵了下,查API又覺(jué)得理解得不深刻,那還是查下Daemon這個(gè)詞有什么意思,什么詞源吧。Daemon 中的 ae 為一個(gè)音,重音在 /di:/ 上,好象是指希臘守護(hù)神的意思吧。在計(jì)算機(jī)專(zhuān)業(yè)英語(yǔ)中是守護(hù)線程的意思。原以為如果一個(gè)線程被光榮地定義為守護(hù)線程,一定會(huì)直到進(jìn)程運(yùn)行到最后一刻,但真錯(cuò)了,如果一個(gè)線程是守護(hù)線程,那么,主線程運(yùn)行結(jié)束時(shí),如果沒(méi)有任何非守護(hù)線程在運(yùn)行,守護(hù)線程就會(huì)自盡了。
setDaemon方法是Thread中的方法,默認(rèn)為false狀態(tài),將該線程標(biāo)記為守護(hù)線程或用戶(hù)線程,該方法必須在啟動(dòng)線程前調(diào)用,具有最低的優(yōu)先級(jí),讓系統(tǒng)資源優(yōu)先調(diào)用其他線程。當(dāng)正在運(yùn)行的線程都是守護(hù)線程時(shí),Java 虛擬機(jī)退出。


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

import java.io.IOException;

class TestMain4 extends Thread {
   public void run() {            //永真循環(huá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,即可主線程結(jié)束,test線程也結(jié)束。
       test.start();
       System.out.println("isDaemon = " + test.isDaemon());
       try {
           System.in.read();   // 接受輸入,使程序在此停頓,一旦接收到用戶(hù)輸入,main線程結(jié)束,守護(hù)線程自動(dòng)結(jié)束
       } catch (IOException ex) {}
   }
}

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

新聞標(biāo)題:java及python中如何守護(hù)線程Daemon
文章鏈接:http://www.chinadenli.net/article42/ieochc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站App開(kāi)發(fā)手機(jī)網(wǎng)站建設(shè)服務(wù)器托管定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)