Java執行緒與併發程式設計實踐----額外的執行緒能力
一、執行緒組
這是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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java併發程式設計:Java執行緒Java程式設計執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- Java併發程式設計之執行緒安全、執行緒通訊Java程式設計執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- java併發程式設計——執行緒池Java程式設計執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- 併發程式設計與執行緒安全程式設計執行緒
- Java併發程式設計之執行緒篇之執行緒的由來(一)Java程式設計執行緒
- Java併發程式設計之執行緒篇之執行緒中斷(三)Java程式設計執行緒
- Java併發程式設計之執行緒篇之執行緒簡介(二)Java程式設計執行緒
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計-執行緒基礎Java程式設計執行緒
- Java併發程式設計:執行緒池ThreadPoolExecutorJava程式設計執行緒thread
- java併發程式設計:執行緒池的使用Java程式設計執行緒
- Java高併發與多執行緒(二)-----執行緒的實現方式Java執行緒
- 併發程式設計之:執行緒程式設計執行緒
- java多執行緒與併發 - 執行緒池詳解Java執行緒
- Java併發程式設計:執行緒和鎖的使用與解析Java程式設計執行緒
- Java 併發程式設計 | 執行緒池詳解Java程式設計執行緒
- 《java併發程式設計的藝術》執行緒池Java程式設計執行緒
- 從執行緒到併發程式設計執行緒程式設計
- 【多執行緒高併發程式設計】二 實現多執行緒的幾種方式執行緒程式設計
- Java併發(一)----程式、執行緒、並行、併發Java執行緒並行
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- Java併發程式設計:Java的四種執行緒池的使用,以及自定義執行緒工廠Java程式設計執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java併發程式設計——深入理解執行緒池Java程式設計執行緒
- Java併發程式設計序列之執行緒狀態Java程式設計執行緒
- Java併發(四)----執行緒執行原理Java執行緒
- Java併發程式設計實戰(5)- 執行緒生命週期Java程式設計執行緒
- 【架構】Java併發程式設計——執行緒池的使用架構Java程式設計執行緒
- 常用高併發網路執行緒模型設計及mongodb執行緒模型優化實踐執行緒模型MongoDB優化
- 【JAVA併發第二篇】Java執行緒的建立與執行,執行緒狀態與常用方法Java執行緒
- 多執行緒與高併發(二)執行緒安全執行緒
- 併發與多執行緒之執行緒安全篇執行緒
- Java併發程式設計(二)如何保證執行緒同時/交替執行Java程式設計執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- JAVA多執行緒併發Java執行緒