中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java多線程的其他知識_動力節點Java學院整理

發布時間:2020-08-23 12:50:16 來源:腳本之家 閱讀:168 作者:mrr 欄目:編程語言

一、線程組

 /** 
 * A thread group represents a set of threads. In addition, a thread 
 * group can also include other thread groups. The thread groups form 
 * a tree in which every thread group except the initial thread group 
 * has a parent. 
 * <p> 
 * A thread is allowed to access information about its own thread 
 * group, but not to access information about its thread group's 
 * parent thread group or any other thread groups. 
 * 
 * @author unascribed 
 * @version 1.66, 03/13/08 
 * @since  JDK1.0 
 */ 

一個線程組代表了一系列的線程。并且,一個線程組可以包括其他的線程組。除了初始線程組外,每個線程組都有一個父線程組,類似于樹的結構。

一個線程可以訪問它所在線程組的信息, 不可以訪問它父線程組和其他線程組的信息。

 從這段話中可以大概明白線程組的概念,所有的線程和線程組構成一個樹的結構,如下:

Java多線程的其他知識_動力節點Java學院整理 

查看Thread的API,可以看到,創建一個線程可以指定它的線程組和不指定線程組。如果指定其所屬的線程組,那么該線程組是創建它的線程所屬線程組的子線程組。如果不指定線程組,則屬于默認情況,該線程和創建它的線程在同一個線程組。

以上面的圖舉個簡單的例子:

如果main線程創建了Thread1線程,沒有指定Thread1所在的線程組,那么Thread1就默認和main線程屬于同一個線程組,即系統線程組。

如果main線程創建了Thread3線程,沒指定Thread3所在的線程組為線程組1,那么線程組1就屬于系統線程組,和main線程在樹結構中平級。

一旦某個線程加入了指定線程組之后,該線程將一直屬于該線程組,直到該線程死亡,線程運行中途不能改變它所屬的線程組。因為指定線程所在線程組是在創建線程的視乎完成的,所以之后不能再修改它所在的線程組。

下面是ThreadGroup的方法摘要

Java多線程的其他知識_動力節點Java學院整理

Java多線程的其他知識_動力節點Java學院整理

Java多線程的其他知識_動力節點Java學院整理

二、線程組與未處理的異常

從JDK1.5開始,Java加強了線程的異常處理,如果線程執行過程中拋出了一個未處理的異常,JVM在結束該線程之前會自動查找是否有對應的Thread.UncaughtExceptionHandler對象,如果找到該處理器對象,將會調用該對象的uncaughtException(Thread t,Throwable e)方法來處理該異常。

Thread.UncaughtExceptionHandler是Thread類的一個內部公共靜態接口,該接口內只有一個方法:

void uncaughtException(Thread t,Throwable t),該方法中的t代表出現異常的線程,而e代表該線程拋出的異常。

Thread類提供了兩個方法來設置異常處理器:

public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)

線程類的所有線程實例設置默認的異常處理器

public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)

為指定線程的實例設置異常處理器

ThreadGroup類實現了Thread.UncaughtExceptionHandler接口,所以每個線程所屬的線程組將會作為默認的異常處理器。當一個線程拋出未處理的異常時,JVM會首先查找該異常對應的異常處理器(setUncaughtExceptionHandler方法設置的異常處理器),如果找到該異常處理器,將調用該異常處理器處理該異常,否則,JVM將會調用該線程所屬的線程組對象的uncaughtException方法來處理該異常,線程組處理異常的流程如下:

1)、如果該線程組有父線程組,則調用父線程組的uncaughtException方法來處理該異常

2)、否則,如果該線程實例所屬的線程類有默認的異常處理器(由setDefaultUncaughtExceptionHandler方法設置的異常處理器),那么就調用該異常處理器來處理該異常

3)、否則,將異常調試棧的信息打印到System.err錯誤輸出流,并結束該線程。

看下面的例子:

 class MyHandler implements Thread.UncaughtExceptionHandler{ 
   @Override 
   public void uncaughtException(Thread t, Throwable e) { 
     System.out.println("出現了異常"); 
     e.printStackTrace(); 
   } 
 } 
 public class Test{ 
   public static void main(String[] args) { 
     Thread.currentThread().setUncaughtExceptionHandler(new MyHandler()); 
     int a=1/0; 
   } 
 } 

在主線程中設置了異常處理器,最后捕獲了異常。

以上所述是小編給大家介紹的Java多線程的其他知識_動力節點Java學院整理,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西平县| 临湘市| 新龙县| 手游| 滕州市| 浦东新区| 库车县| 临汾市| 桑日县| 桑植县| 蒙城县| 扶风县| 新昌县| 荣昌县| 涟水县| 株洲县| 房产| 葫芦岛市| 南通市| 周宁县| 枣阳市| 岳阳市| 普格县| 广汉市| 壤塘县| 津市市| 霍山县| 深州市| 喜德县| 安徽省| 九台市| 精河县| 确山县| 道真| 蒲江县| 常山县| 柞水县| 正阳县| 页游| 虞城县| 邯郸县|