<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經轉移至github,大家請訪問 http://qaseven.github.io/

    Java并發編程:守護線程

    Java中有兩類線程:用戶線程(UserThread)、守護線程(DaemonThread)。

      所謂守護線程,是指在程序運行的時候在后臺提供一種通用服務的線程,比如垃圾回收線程就是一個很稱職的守護者,并且這種線程并不屬于程序中不可或缺的部分。因此,當所有的非守護線程結束時,程序也就終止了,同時會殺死進程中的所有守護線程。反過來說,只要任何非守護線程還在運行,程序就不會終止。

      用戶線程和守護線程兩者幾乎沒有區別,唯一的不同之處就在于虛擬機的離開:如果用戶線程已經全部退出運行了,只剩下守護線程存在了,虛擬機也就退出了。因為沒有了被守護者,守護線程也就沒有工作可做了,也就沒有繼續運行程序的必要了。

      將線程轉換為守護線程可以通過調用Thread對象的setDaemon(true)方法來實現。在使用守護線程時需要注意一下幾點:

      (1)thread.setDaemon(true)必須在thread.start()之前設置,否則會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置為守護線程。

      (2)在Daemon線程中產生的新線程也是Daemon的。

      (3)守護線程應該永遠不去訪問固有資源,如文件、數據庫,因為它會在任何時候甚至在一個操作的中間發生中斷。

      代碼示例:

    1. import java.util.concurrent.TimeUnit;  
    2. /** 
    3. * 守護線程 
    4. */ 
    5. public class Daemons {  
    6. /** 
    7. * @param args 
    8. * @throws InterruptedException  
    9. */ 
    10. public static void main(String[] args) throws InterruptedException {  
    11. Thread d = new Thread(new Daemon());  
    12. d.setDaemon(true); //必須在啟動線程前調用 
    13. d.start();  
    14. System.out.println("d.isDaemon() = " + d.isDaemon() + ".");  
    15. TimeUnit.SECONDS.sleep(1);  
    16. }  
    17. }  
    18. class DaemonSpawn implements Runnable {  
    19. public void run() {  
    20. while (true) {  
    21. Thread.yield();  
    22. }  
    23. }  
    24. }  
    25. class Daemon implements Runnable {  
    26. private Thread[] t = new Thread[10];  
    27. public void run() {  
    28. for (int i=0; i<t.length; i++) {  
    29. t[i] = new Thread(new DaemonSpawn());  
    30. t[i].start();  
    31. System.out.println("DaemonSpawn " + i + " started.");  
    32. }  
    33. for (int i=0; i<t.length; i++) {  
    34. System.out.println("t[" + i + "].isDaemon() = " +  
    35. t[i].isDaemon() + ".");  
    36. }  
    37. while (true) {  
    38. Thread.yield();  
    39. }  
    40. }  
    41. }

      運行結果:

    1. d.isDaemon() = true.  
    2. DaemonSpawn 0 started.  
    3. DaemonSpawn 1 started.  
    4. DaemonSpawn 2 started.  
    5. DaemonSpawn 3 started.  
    6. DaemonSpawn 4 started.  
    7. DaemonSpawn 5 started.  
    8. DaemonSpawn 6 started.  
    9. DaemonSpawn 7 started.  
    10. DaemonSpawn 8 started.  
    11. DaemonSpawn 9 started.  
    12. t[0].isDaemon() = true.  
    13. t[1].isDaemon() = true.  
    14. t[2].isDaemon() = true.  
    15. t[3].isDaemon() = true.  
    16. t[4].isDaemon() = true.  
    17. t[5].isDaemon() = true.  
    18. t[6].isDaemon() = true.  
    19. t[7].isDaemon() = true.  
    20. t[8].isDaemon() = true.  
    21. t[9].isDaemon() = true.

     以上結果說明了守護線程中產生的新線程也是守護線程。

      如果將mian函數中的TimeUnit.SECONDS.sleep(1);注釋掉,運行結果如下:

    1. d.isDaemon() = true.  
    2. DaemonSpawn 0 started.  
    3. DaemonSpawn 1 started.  
    4. DaemonSpawn 2 started.  
    5. DaemonSpawn 3 started.  
    6. DaemonSpawn 4 started.  
    7. DaemonSpawn 5 started.  
    8. DaemonSpawn 6 started.  
    9. DaemonSpawn 7 started.  
    10. DaemonSpawn 8 started.  
    11. DaemonSpawn 9 started.

      以上結果說明了如果用戶線程已經全部退出運行了,只剩下守護線程存在了,虛擬機也就退出了。下面的例子也說明了這個問題。

      代碼示例:

    1. import java.util.concurrent.TimeUnit;  
    2. /**  
    3. * Finally shoud be always run ?  
    4. */  
    5. public class DaemonsDontRunFinally {  
    6. /**  
    7. * @param args  
    8. */  
    9. public static void main(String[] args) {  
    10. Thread t = new Thread(new ADaemon());  
    11. t.setDaemon(true);  
    12. t.start();  
    13. }  
    14. }  
    15. class ADaemon implements Runnable {  
    16. public void run() {  
    17. try {  
    18. System.out.println("start ADaemon...");  
    19. TimeUnit.SECONDS.sleep(1);  
    20. } catch (InterruptedException e) {  
    21. System.out.println("Exiting via InterruptedException");  
    22. } finally {  
    23. System.out.println("This shoud be always run ?");  
    24. }  
    25. }  
    26. }

      運行結果:

      start ADaemon...

      如果將main函數中的t.setDaemon(true);注釋掉,運行結果如下:

      start ADaemon...

      This shoud be always run ?



    posted on 2011-12-31 10:34 順其自然EVO 閱讀(198) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲视频国产视频| 午夜在线亚洲男人午在线| 88xx成人永久免费观看| 亚洲国产日韩成人综合天堂| 亚洲一区二区三区91| 不卡视频免费在线观看| 国产免费黄色大片| 亚洲成人黄色在线| a毛片在线免费观看| 免费国产成人高清在线观看麻豆 | 国产区图片区小说区亚洲区| 97视频免费在线| 亚洲大成色www永久网站| 国产一区二区三区亚洲综合| 我要看免费的毛片| 亚洲精品永久www忘忧草| 国产做国产爱免费视频| 免费午夜爽爽爽WWW视频十八禁 | 人禽杂交18禁网站免费| 91精品国产亚洲爽啪在线影院| 国产免费人成视频在线播放播| 国产一区二区三区在线免费| tom影院亚洲国产一区二区| 午夜网站在线观看免费完整高清观看| 亚洲无码精品浪潮| 久久亚洲精品11p| 毛片免费在线视频| 亚洲国产精品久久网午夜| 午夜影院免费观看| 亚洲人JIZZ日本人| 一个人看的免费观看日本视频www| 国产亚洲福利一区二区免费看| 亚洲欧洲日韩国产一区二区三区| 131美女爱做免费毛片| 亚洲AV无码一区二区二三区软件| 国产精品1024在线永久免费| 亚洲国产成人精品女人久久久| 美女啪啪网站又黄又免费| 在线观看免费精品国产| 亚洲色丰满少妇高潮18p|