萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> Java多線程的線程守護兩個例子

Java多線程的線程守護兩個例子

   核心說明:理解這句話下面可以不看了。

  守護與其他線程同時執行,當正在運行的線程都是守護線程時,Java 虛擬機退出。

  守護線程與普通線程寫法上基本麼啥區別,調用線程對象的方法setDaemon(true),則可以將其設置為守護線程。

  守護線程使用的情況較少,但並非無用,舉例來說,JVM的垃圾回收、內存管理等線程都是守護線程。還有就是在做數據庫應用時候,使用的數據庫連接池,連接池本身也包含著很多後台線程,監控連接個數、超時時間、狀態等等。

  setDaemon方法的詳細說明:

  public final void setDaemon(boolean on)將該線程標記為守護線程或用戶線程。當正在運行的線程都是守護線程時,Java 虛擬機退出。

  該方法必須在啟動線程前調用。

  該方法首先調用該線程的 checkAccess 方法,且不帶任何參數。這可能拋出 SecurityException(在當前線程中)。

  參數:

  on - 如果為 true,則將該線程標記為守護線程。

  拋出:

  IllegalThreadStateException - 如果該線程處於活動狀態。

  SecurityException - 如果當前線程無法修改該線程。

  另請參見:

 代碼如下       isDaemon(), checkAccess()
/** 
* Java線程:線程的調度-守護線程 

* @author leizhimin 2009-11-4 9:02:40 
*/ 
public class Test { 
        public static void main(String[] args) { 
                Thread t1 = new MyCommon(); 
                Thread t2 = new Thread(new MyDaemon()); 
                t2.setDaemon(true);        //設置為守護線程 
 
                t2.start(); 
                t1.start(); 
        } 

 
class MyCommon extends Thread { 
        public void run() { 
                for (int i = 0; i < 5; i++) { 
                        System.out.println("線程1第" + i + "次執行!"); 
                        try { 
                                Thread.sleep(7); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 

 
class MyDaemon implements Runnable { 
        public void run() { 
                for (long i = 0; i < 9999999L; i++) { 
                        System.out.println("後台線程第" + i + "次執行!"); 
                        try { 
                                Thread.sleep(7); 
                        } catch (InterruptedException e) { 
                                e.printStackTrace(); 
                        } 
                } 
        } 
}

  後台線程第0次執行!

  線程1第0次執行!

  線程1第1次執行!

  後台線程第1次執行!

  後台線程第2次執行!

  線程1第2次執行!

  線程1第3次執行!

  後台線程第3次執行!

  線程1第4次執行!

  後台線程第4次執行!

  後台線程第5次執行!

  後台線程第6次執行!

  後台線程第7次執行!

  Process finished with exit code 0

  從上面的執行結果可以看出:

  前台線程是保證執行完畢的,後台線程還沒有執行完畢就退出了。

  實際上:JRE判斷程序是否執行結束的標准是所有的前台執線程行完畢了,而不管後台線程的狀態,因此,在使用後台縣城時候一定要注意這個問題。

  後台線程(守護線程)

  所謂的後台線程,是指在程序運行的時候在後台提供一種通用服務的線程,並且這種線程並不屬於程序中不可或缺的部分。因此當所有的非後台線程結束時,程序也就終止了,同時會殺死所有後台線程。反過來說,只要有任何非後台線程(用戶線程)還在運行,程序就不會終止。後台線程在不執行finally子句的情況下就會終止其run方法。後台線程創建的子線程也是後台線程。

  下面是一個後台線程的示例:

 代碼如下   <span style="font-size:16px;">package demo.thread;  
  
import java.util.concurrent.TimeUnit;  
  
public class DaemonDemo implements Runnable {  
    @Override  
    public void run() {  
        try {  
            while (true) {  
                Thread.sleep(1000);  
   &
copyright © 萬盛學電腦網 all rights reserved