Java執行緒與併發程式設計實踐----額外的執行緒能力

Bacer發表於2021-09-09

一、執行緒組

  

    這是Thread類的某些構造方法,可以看到有一個引數為ThreadGroup類,該類就是執行緒組,

JDK中是這樣描述的:

執行緒組表示一個執行緒的集合。此外,執行緒組也可以包含其他執行緒組。執行緒組構成一棵樹,

在樹中,除了初始執行緒組外,每個執行緒組都有一個父執行緒組。允許執行緒訪問有關自己的

執行緒組的資訊,但是不允許它訪問有關其執行緒組的父執行緒組或其他任何執行緒組的資訊。 

    使用ThreadGroup物件,你可以對執行緒組中的所有執行緒物件進行操作,執行緒組簡化

了多條執行緒的管理工作。

    儘管執行緒組看上去非常有用但是礙於下列原因,我們萬萬不能使用它:

  •     ThreadGroup中最有用的方法就是void suspend()、void resume()以及void stop()

但這些方法都已經被廢棄了,他們很容易誘發死鎖等問題。

  • ThreadGroup是非執行緒安全的。

但是ThreadGroup在處理執行緒執行過程中崔產生的異常方面做出的貢獻,我們還是應該對他有所瞭解。

public class Test {		public static void main(String[] args) {		Runnable r = new Runnable() {						@Override			public void run() {				int a = 1 / 0;			}		};		Thread th = new Thread(r);		th.start();	}}

執行結果:

Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero	at 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() {						@Override			public void run() {				int a = 1 / 0;			}		};		Thread.UncaughtExceptionHandler tu = new Thread.UncaughtExceptionHandler() {						@Override			public 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文件

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2768/viewspace-2813157/,如需轉載,請註明出處,否則將追究法律責任。

相關文章