最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談java的守護(hù)線程與非守護(hù)線程

 更新時(shí)間:2017年10月13日 11:37:06   作者:super-d2  
這篇文章主要介紹了淺談java的守護(hù)線程與非守護(hù)線程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

最近重新研究Java基礎(chǔ)知識,發(fā)現(xiàn)以前太多知識知識略略帶過了,比較說Java的線程機(jī)制,在Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護(hù)線程) ,(PS:以前忽略了)。

估計(jì)學(xué)過Unix開發(fā)但是沒有細(xì)致學(xué)習(xí)Java的同學(xué)們會疑惑了,操作系統(tǒng)里面是沒有所謂的守護(hù)線程的概念,只有守護(hù)進(jìn)程一說,但是Java語言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺把操作系統(tǒng)的底層給屏蔽起來,所以它可以在它自己的虛擬的平臺里面構(gòu)造出對自己有利的機(jī)制,而語言或者說平臺的設(shè)計(jì)者多多少少是收到Unix思想的影響,而守護(hù)線程機(jī)制又是對JVM這樣的平臺湊合,于是守護(hù)線程應(yīng)運(yùn)而生。

Daemon的作用是為其他線程的運(yùn)行提供服務(wù),比如說GC線程。其實(shí)User Thread線程和Daemon Thread守護(hù)線程本質(zhì)上來說去沒啥區(qū)別的,唯一的區(qū)別之處就在虛擬機(jī)的離開:如果User Thread全部撤離,那么Daemon Thread也就沒啥線程好服務(wù)的了,所以虛擬機(jī)也就退出了。

守護(hù)線程并非虛擬機(jī)內(nèi)部可以提供,用戶也可以自行的設(shè)定守護(hù)線程,方法:public final void setDaemon(boolean on) ;但是有幾點(diǎn)需要注意:

1)、thread.setDaemon(true)必須在thread.start()之前設(shè)置,否則會跑出一個(gè)IllegalThreadStateException異常。你不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程。  (備注:這點(diǎn)與守護(hù)進(jìn)程有著明顯的區(qū)別,守護(hù)進(jìn)程是創(chuàng)建后,讓進(jìn)程擺脫原會話的控制+讓進(jìn)程擺脫原進(jìn)程組的控制+讓進(jìn)程擺脫原控制終端的控制;所以說寄托于虛擬機(jī)的語言機(jī)制跟系統(tǒng)級語言有著本質(zhì)上面的區(qū)別)

2)、 在Daemon線程中產(chǎn)生的新線程也是Daemon的。  (這一點(diǎn)又是有著本質(zhì)的區(qū)別了:守護(hù)進(jìn)程fork()出來的子進(jìn)程不再是守護(hù)進(jìn)程,盡管它把父進(jìn)程的進(jìn)程相關(guān)信息復(fù)制過去了,但是子進(jìn)程的進(jìn)程的父進(jìn)程不是init進(jìn)程,所謂的守護(hù)進(jìn)程本質(zhì)上說就是“父進(jìn)程掛掉,init收養(yǎng),然后文件0,1,2都是/dev/null,當(dāng)前目錄到/”)

3)、不是所有的應(yīng)用都可以分配給Daemon線程來進(jìn)行服務(wù),比如讀寫操作或者計(jì)算邏輯。因?yàn)樵贒aemon Thread還沒來的及進(jìn)行操作時(shí),虛擬機(jī)可能已經(jīng)退出了。

例子:

//完成文件輸出的守護(hù)線程任務(wù)

import java.io.*; 

 

class TestRunnable implements Runnable{ 

  public void run(){ 

        try{ 

         Thread.sleep(1000);//守護(hù)線程阻塞1秒后運(yùn)行 

         File f=new File("daemon.txt"); 

         FileOutputStream os=new FileOutputStream(f,true); 

         os.write("daemon".getBytes()); 

      } 

        catch(IOException e1){ 

     e1.printStackTrace(); 

        } 

        catch(InterruptedException e2){ 

         e2.printStackTrace(); 

      } 

  } 

} 

public class TestDemo2{ 

  public static void main(String[] args) throws InterruptedException 

  { 

    Runnable tr=new TestRunnable(); 

    Thread thread=new Thread(tr); 

        thread.setDaemon(true); //設(shè)置守護(hù)線程 

    thread.start(); //開始執(zhí)行分進(jìn)程 

  } 

} 

運(yùn)行結(jié)果:文件daemon.txt中沒有"daemon"字符串。

但是如果把thread.setDaemon(true); //設(shè)置守護(hù)線程注釋掉,文件daemon.txt是可以被寫入daemon字符串的

 

JRE判斷程序是否執(zhí)行結(jié)束的標(biāo)準(zhǔn)是所有的前臺執(zhí)線程行完畢了,而不管后臺線程的狀態(tài),因此,在使用后臺線程候一定要注意這個(gè)問題。

但是daemon Thread實(shí)際應(yīng)用在那里呢?舉個(gè)例子,web服務(wù)器中的Servlet,容器啟動時(shí)后臺初始化一個(gè)服務(wù)線程,即調(diào)度線程,負(fù)責(zé)處理http請求,然后每個(gè)請求過來調(diào)度線程從線程池中取出一個(gè)工作者線程來處理該請求,從而實(shí)現(xiàn)并發(fā)控制的目的。

網(wǎng)上摘的一個(gè)圖,方便大家理解:

 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

纳雍县| 两当县| 上高县| 花莲县| 米林县| 镇宁| 沐川县| 上高县| 临沧市| 鄂州市| 柘城县| 丽水市| 平顶山市| 房产| 浠水县| 合水县| 双峰县| 将乐县| 富阳市| 屏山县| 鄂州市| 石台县| 无锡市| 镇沅| 西乌珠穆沁旗| 信宜市| 繁昌县| 深水埗区| 六盘水市| 湘西| 江孜县| 清流县| 邯郸县| 连江县| 和政县| 马龙县| 温宿县| 那坡县| 门头沟区| 体育| 微山县|