成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java并發(fā)編程:守護(hù)線程

開(kāi)發(fā) 后端
所謂守護(hù)線程,是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程,比如垃圾回收線程就是一個(gè)很稱(chēng)職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。下面,讓我們來(lái)繼續(xù)深入了解守護(hù)線程。

在Java中有兩類(lèi)線程:用戶線程 (User Thread)、守護(hù)線程 (Daemon Thread)。

所謂守護(hù)線程,是指在程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程,比如垃圾回收線程就是一個(gè)很稱(chēng)職的守護(hù)者,并且這種線程并不屬于程序中不可或缺的部分。因此,當(dāng)所有的非守護(hù)線程結(jié)束時(shí),程序也就終止了,同時(shí)會(huì)殺死進(jìn)程中的所有守護(hù)線程。反過(guò)來(lái)說(shuō),只要任何非守護(hù)線程還在運(yùn)行,程序就不會(huì)終止。

用戶線程和守護(hù)線程兩者幾乎沒(méi)有區(qū)別,***的不同之處就在于虛擬機(jī)的離開(kāi):如果用戶線程已經(jīng)全部退出運(yùn)行了,只剩下守護(hù)線程存在了,虛擬機(jī)也就退出了。 因?yàn)闆](méi)有了被守護(hù)者,守護(hù)線程也就沒(méi)有工作可做了,也就沒(méi)有繼續(xù)運(yùn)行程序的必要了。

將線程轉(zhuǎn)換為守護(hù)線程可以通過(guò)調(diào)用Thread對(duì)象的setDaemon(true)方法來(lái)實(shí)現(xiàn)。在使用守護(hù)線程時(shí)需要注意一下幾點(diǎn):

(1) thread.setDaemon(true)必須在thread.start()之前設(shè)置,否則會(huì)跑出一個(gè)IllegalThreadStateException異常。你不能把正在運(yùn)行的常規(guī)線程設(shè)置為守護(hù)線程。

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

(3) 守護(hù)線程應(yīng)該永遠(yuǎn)不去訪問(wèn)固有資源,如文件、數(shù)據(jù)庫(kù),因?yàn)樗鼤?huì)在任何時(shí)候甚至在一個(gè)操作的中間發(fā)生中斷。

代碼示例:

  1. import java.util.concurrent.TimeUnit;  
  2. /**  
  3. * 守護(hù)線程  
  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); //必須在啟動(dòng)線程前調(diào)用  
  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. }  

運(yùn)行結(jié)果:

  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. 

以上結(jié)果說(shuō)明了守護(hù)線程中產(chǎn)生的新線程也是守護(hù)線程。

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

  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. 

以上結(jié)果說(shuō)明了如果用戶線程已經(jīng)全部退出運(yùn)行了,只剩下守護(hù)線程存在了,虛擬機(jī)也就退出了。下面的例子也說(shuō)明了這個(gè)問(wèn)題。

代碼示例:

  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. }  

運(yùn)行結(jié)果:

start ADaemon...

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

start ADaemon...

This shoud be always run ?

原文鏈接:http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html

【編輯推薦】

  1. 深入Java虛擬機(jī)之內(nèi)存優(yōu)化
  2. 深入Java虛擬機(jī)之虛擬機(jī)體系結(jié)構(gòu)
  3. Java與XML:采用DOM操作XML文件
  4. 從Java的角度理解Ext的extend
  5. Windows 64位環(huán)境的Java服務(wù)配置
責(zé)任編輯:林師授 來(lái)源: Luochengor的博客
相關(guān)推薦

2025-02-17 00:00:25

Java并發(fā)編程

2025-02-19 00:05:18

Java并發(fā)編程

2025-01-10 07:10:00

2025-02-06 03:14:38

2024-12-31 09:00:12

Java線程狀態(tài)

2019-11-07 09:20:29

Java線程操作系統(tǒng)

2025-02-03 08:23:33

2023-10-08 09:34:11

Java編程

2023-10-18 15:19:56

2022-11-09 09:01:08

并發(fā)編程線程池

2019-09-16 08:45:53

并發(fā)編程通信

2022-03-31 07:52:01

Java多線程并發(fā)

2025-02-03 00:40:00

線程組Java并發(fā)編程

2017-01-10 13:39:57

Python線程池進(jìn)程池

2023-09-26 10:30:57

Linux編程

2017-09-19 14:53:37

Java并發(fā)編程并發(fā)代碼設(shè)計(jì)

2023-10-18 09:27:58

Java編程

2021-05-06 08:11:03

Java用戶線程守護(hù)線程

2025-06-18 08:10:00

Java并發(fā)編程開(kāi)發(fā)

2020-12-08 08:53:53

編程ThreadPoolE線程池
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品亚洲永久免费精品 | 国产高清精品一区二区三区 | 国产精品久久久久久久久久久新郎 | 久久精品小视频 | 久久精品国产一区二区三区 | 一区二区三区视频免费观看 | 一区二区三区高清 | 欧美一a | 欧美日一区二区 | 亚洲精品成人av久久 | 亚洲精品一区二区三区蜜桃久 | 91在线精品视频 | 九九在线视频 | 91国自产| 国产精品久久久久久久7电影 | a级大毛片 | 91久久综合 | 亚洲一区毛片 | 青青久草 | 亚洲成人网在线播放 | 国产激情在线 | 麻豆av在线 | 久久久久久国产精品 | 国产高清免费视频 | 一级黄在线观看 | 国产精品永久在线观看 | 亚洲图片一区二区三区 | 久久国产一区二区 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 国产成人精品一区二 | 无码日韩精品一区二区免费 | 欧美一级欧美三级在线观看 | 欧美综合一区 | 日韩视频在线观看 | 中文字幕一区在线观看视频 | 欧美成人精品在线观看 | 日韩毛片在线免费观看 | 中文字幕在线观看一区 | 天天干视频在线 | 国产视频福利一区 | yiren22 亚洲综合 |