標籤:manage nbsp iss man port orm 線程 col row
一、線程組
這是Thread類的某些構造方法,可以看到有一個參數為ThreadGroup類,該類就是線程組,
JDK中是這樣描述的:
線程組表示一個線程的集合。此外,線程組也可以包含其他線程組。線程組構成一棵樹,
在樹中,除了初始線程組外,每個線程組都有一個父線程組。允許線程訪問有關自己的
線程組的資訊,但是不允許它訪問有關其線程組的父線程組或其他任何線程組的資訊。
使用ThreadGroup對象,你可以對線程組中的所有線程對象進行操作,線程組簡化
了多條線程的管理工作。
儘管線程組看上去非常有用但是礙於下列原因,我們萬萬不能使用它:
但這些方法都已經被廢棄了,他們很容易誘發死結等問題。
但是ThreadGroup在處理線程執行過程中崔產生的異常方面做出的貢獻,我們還是應該對他有所瞭解。
public class Test {public static void main(String[] args) {Runnable r = new Runnable() {@Overridepublic void run() {int a = 1 / 0;}};Thread th = new Thread(r);th.start();}}
運行結果:
Exception in thread "Thread-0" java.lang.ArithmeticException: / by zeroat Test$1.run(Test.java:10)at java.lang.Thread.run(Thread.java:745)
上面是當一個異常線上程的run()方法內被拋出時的處理結果。那麼問題來了,線程中的這個異常
是如何處理的呢,流程是這樣的,當run()方法中拋出異常時,JVM會擷取一個Thread.UncaughtExceptionHandler
的執行個體,該執行個體有Thread的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法
設定,當找到這個Handler時,線程執行他的void uncughtException();進行異常處理列印拋出異常。
那麼Thread.UncaughtExceptionHandler又是從哪裡來的呢?
如上他是被Thread類所封閉的一個介面,所謂封閉類相當於如下:
public class Test {public interface myInterface{}}
但是我們好像並沒有進行setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)這一步操作
那這個異常是如何處理的呢?其實當我們沒有設定例外處理常式的時候,他會自動啟動預設
的異常處理流程,原始碼如下:
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission( new RuntimePermission("setDefaultUncaughtExceptionHandler") ); } defaultUncaughtExceptionHandler = eh; }
該方法是設定預設的處理方式,就是剛才程式運行所列印出來的那種形式。下面我們自己來設定異常處理:
import java.lang.Thread.UncaughtExceptionHandler;public class Test {public static void main(String[] args) {Runnable r = new Runnable() {@Overridepublic void run() {int a = 1 / 0;}};Thread.UncaughtExceptionHandler tu = new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {System.out.println("自訂異常處理。。。" + e + "該線程為" + t);}};Thread th = new Thread(r);th.setUncaughtExceptionHandler(tu);th.start();}}
運行結果:
自訂異常處理。。。java.lang.ArithmeticException: / by zero該線程為Thread[Thread-0,5,main]
但是搞了半天好像異常處理和ThreadGroup沒什麼關係,其實不然,觀察:
ThreadGroup實現了Thread.UncaughtExceptionHandler,因此
當我們沒有調用setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)時,
JVM會自動找到線程對應的ThreadGroup對象,找到他重寫了的uncaughtException(Thread t,Throwable e)
方法進行異常處理,倘若該ThreadGroup對象沒有重寫此方法,他會找到它父類的方法進行執行。
二、線程局部變數
參見以前的部落格:http://blog.51cto.com/12222886/1940714
三、定時器架構
有的任務的執行需要我們定義一個時間,並非立即執行,有的任務可能
定時只執行一次,而有的會定時重複執行,定時器架構可以解決這些問題。
Java.Util.Timer和Java.Util.TimeTasks
具體不在贅述,可參見JDK文檔
Java線程與並發編程實踐----額外的線程能力