自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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

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

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

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

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

代碼示例:

  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); //必須在啟動線程前調(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. }  

運行結(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é)果說明了守護線程中產(chǎn)生的新線程也是守護線程。

如果將mian函數(shù)中的TimeUnit.SECONDS.sleep(1);注釋掉,運行結(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é)果說明了如果用戶線程已經(jīng)全部退出運行了,只剩下守護線程存在了,虛擬機也就退出了。下面的例子也說明了這個問題。

代碼示例:

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

運行結(jié)果:

start ADaemon...

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

start ADaemon...

This shoud be always run ?

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

【編輯推薦】

  1. 深入Java虛擬機之內(nèi)存優(yōu)化
  2. 深入Java虛擬機之虛擬機體系結(jié)構(gòu)
  3. Java與XML:采用DOM操作XML文件
  4. 從Java的角度理解Ext的extend
  5. Windows 64位環(huán)境的Java服務(wù)配置
責(zé)任編輯:林師授 來源: 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編程

2022-11-09 09:01:08

并發(fā)編程線程池

2023-10-18 15:19:56

2019-09-16 08:45:53

并發(fā)編程通信

2022-03-31 07:52:01

Java多線程并發(fā)

2025-02-03 00:40:00

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

2023-10-18 09:27:58

Java編程

2017-01-10 13:39:57

Python線程池進程池

2023-09-26 10:30:57

Linux編程

2017-09-19 14:53:37

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

2021-05-06 08:11:03

Java用戶線程守護線程

2025-03-03 04:00:00

線程安全CPU

2020-09-04 10:29:47

Java線程池并發(fā)
點贊
收藏

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