守護進程: 作用:後台管理者 比如你正在 用 Java 寫成的編輯器 寫 Word 文檔, 例子: 你一邊敲鍵盤,這是個 非守護線程, 後台還有一個 拼字檢查 線程,它是個守護線程,他盡量不打擾你寫稿子, 你們可以同時進行,他發現有拼字錯誤時在狀態條顯示錯誤,但是你可以忽略。 就像 城堡門前有個衛兵 (守護線程),裡面有諸侯(非守護線程),他們是可以同時乾著各自的活兒,但是 城堡裡面的人都搬走了, 那麼衛兵也就沒有存在的意義了。 守護線程與普通線程的唯一區別是:當JVM中所有的線程都是守護線程的時候,JVM就可以退出了;如果還有一個或以上的非守護線程則不會退出。(以上是針對正常退出,調用System.exit則必定會退出) 所以setDeamon(true)的唯一意義就是告訴JVM不需要等待它退出,讓JVM喜歡什麼退出就退出吧,不用管它。 用法: 1.thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常 2. 在Daemon線程中產生的新線程也是Daemon的。 3.不是所有的應用都可以分配給Daemon線程來進行服務,比如讀寫操作或者計算邏輯。因為在 Daemon Thread還沒來的及進行操作時,虛擬機器可能已經退出了。 樣本: //完成檔案輸出的守護線程任務
import java.io.*; class TestRunnable implements Runnable{ public void run(){ try{ Thread.sleep(1000);//守護線程阻塞1秒後運行 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); //設定守護線程 thread.start(); //開始執行分進程 } } 運行結果:檔案daemon.txt中沒有"daemon"字串。 但是如果把thread.setDaemon(true); //設定守護線程注釋掉,檔案daemon.txt是可以被寫入daemon字串的 未捕獲異常處理器: 首先弄懂什麼是檢查型異常什麼又是非檢查型異常呢。 最簡單的判斷點有兩個: 1.繼承自runtimeexception或error的是非檢查型異常,而繼承自exception的則是檢查型異常(當然,runtimeexception本身也是exception的子類)。 2.對非檢查型類異常可以不用捕獲,而檢查型異常則必須用try語句塊進行處理或者把異常交給上級方法處理總之就是必須寫代碼處理它。 本文: 線程run 方法不能拋出任何 受檢查型異常,但是,非檢查異常查會導致線程終止。 但是,不需要任何catch子句來處理可以被傳播的異常。相反,線上程死亡之前,異常被傳遞到一個用於 未捕獲異常的處理器。 該處理器必須是想一個 Thread.UncaughtExceptionHandler介面的類,這個介面只有一個方法。 void uncaughtExceptionh(Thread t,Throwable e) 可以用 setUncaughtExceptionHandler方法為任何線程安裝一個處理器。 一可以用Thread類的靜態方法 setDefaultUncaughtExceptionHandler為所有線程安裝一個預設的處理器。替換處理器可以使用日誌API發送未捕獲異常到記錄檔。 如果不安裝預設的處理器,預設的處理器為空白。但是,如果不為獨立的線程安裝處理器,此時的處理器就是該線程的 ThreadGroup對象。 java.lang.ThreadGroup 類uncaughtException預設實現的邏輯如下: 如果父線程組存在, 則調用它的uncaughtException方法. 如果父線程組不存在, 但指定了預設處理器 (下節中的As the default handler for the application), 則調用預設的處理器 如果預設處理器沒有設定, 則寫錯誤記錄檔.但如果 exception是ThreadDeath執行個體的話, 忽略。 範例看這裡: https://my.oschina.net/shishaomeng/blog/121740 參考部落格: https://my.oschina.net/shishaomeng/blog/121740 http://blog.csdn.net/yixiaoqingyuz/article/details/4485606 http://bbs.csdn.net/topics/80298851 http://www.cnblogs.com/super-d2/p/3348183.html