JAVA多線程(六)之Hook 線程以及獲取線程執(zhí)行異常

Hook 線程 簡介

Hook線程也叫鉤子線程惠啄,通常我們在運(yùn)行的時候向應(yīng)用程序注入一個或者多個Hook(鉤子)線程慎恒,這樣任内,JVM在退出的時候撵渡,Hook線程將要會啟動

獲取線程運(yùn)行時異常
public void setUncaughtExceptionHandle(UncaughtExceptionHandler er);//為某個特定線程指定UncaughtException
public static void setDefaultUncaughtExceptionHandler(UncaughtException eh);//為當(dāng)前線程設(shè)置全局的UncaughtException
public UncaughtExceptionHandler getUncaughtExceptionHandler();//獲取特定線程的UncaughtExceptionHandler
public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler();//獲取全局的UncaughtExceptionHandler死嗦。

方法介紹:
線程在執(zhí)行單元中是不允許拋出checke異常的趋距,而且線程運(yùn)行在自己的上下問環(huán)境中,派生他的線程將無法直接獲取他的異常信息越除。因此我們需要UncaughtExceptionHandler接口节腐,當(dāng)線程在運(yùn)行的過程中出現(xiàn)了異常時,會回調(diào)UncaughtExceptionHandler接口摘盆,從而得知那個線程在運(yùn)行時出錯翼雀。

實(shí)例代碼如下

    public interface UncaughtExceptionHandler {
        void uncaughtException(Thread t, Throwable e);
    }

從上述代碼中,可以看出孩擂,UncaughtExceptionHandler 是一個接口狼渊,只有一個抽象方法,該接口會被Thread中的dispatchUncaughtException 方法處理回調(diào)

  private void dispatchUncaughtException(Throwable e) {
        getUncaughtExceptionHandler().uncaughtException(this, e);
    }

當(dāng)線程在運(yùn)行時出現(xiàn)異常的時候类垦,JVM會調(diào)用dispatchUncaughtException方法狈邑,該接口會講當(dāng)前線程和異常信息傳遞給該接口.。

public class CauptThreadException {
    public static void main(String[] args) {
        Thread thread = new Thread("CaptureThreadException"){
            @Override
            public void run() {
                int i = 1 / 0;
            }
        };
        thread.setDefaultUncaughtExceptionHandler(new MyCaughtExceptionHandler());
        thread.start();
    }
}

public class MyCaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println(t.getName());
        e.printStackTrace();
    }
}

原理解析

我們可以打開Thread 類蚤认,看下dispatchUncaughtException 方法 調(diào)用了 getUncaughtExceptionHandler() 方法

  public UncaughtExceptionHandler getUncaughtExceptionHandler() {
        return uncaughtExceptionHandler != null ?
            uncaughtExceptionHandler : group;
    }

從上述代碼我們可以分析 米苹,首先 獲取當(dāng)前線程中是否有uncaughtExceptionHandler 如果不等于null 則直接返回,否則返回 ThreadGroup砰琢。然后根據(jù)返回的類型 調(diào)用uncaughtException()方法蘸嘶,

 public void uncaughtException(Thread t, Throwable e) {
        if (parent != null) { //首先判斷當(dāng)前Thread是否有父Group 良瞧,有則調(diào)用父group的方法
            parent.uncaughtException(t, e);
        } else {
           Thread.UncaughtExceptionHandler ueh = Thread.getDefaultUncaughtExceptionHandler();//獲取全局的UncaughtException
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) { //如果沒有父ThreadGroup 同時 也沒有全局的uncaughtExceptionHandler 則直接從異常中信息打印到堆棧中
                System.err.print("Exception in thread \""
                                 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }
獲取uncaughtException 接口流程圖

Hook線程應(yīng)用場景及其注意事項(xiàng)

1.Hook線程只有在收到退出信號才會被執(zhí)行,如果 在Kill 命令的時候使用了參數(shù) -9 那么hook線程得不到執(zhí)行训唱。進(jìn)程也會被退出莺褒。
2.Hook線程可以做一些資源釋放的工作,比如關(guān)閉文件雪情,釋放鏈接等等遵岩。
3.不要使用Hook線程執(zhí)行一些耗時非常長的工作,因?yàn)槌绦蜻t遲不會退出巡通。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尘执,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宴凉,更是在濱河造成了極大的恐慌誊锭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弥锄,死亡現(xiàn)場離奇詭異丧靡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)籽暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒悠,“玉大人熬荆,你說我怎么就攤上這事〕窈” “怎么了卤恳?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寒矿。 經(jīng)常有香客問我突琳,道長,這世上最難降的妖魔是什么符相? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任拆融,我火速辦了婚禮,結(jié)果婚禮上主巍,老公的妹妹穿的比我還像新娘冠息。我一直安慰自己,他們只是感情好孕索,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布逛艰。 她就那樣靜靜地躺著,像睡著了一般搞旭。 火紅的嫁衣襯著肌膚如雪散怖。 梳的紋絲不亂的頭發(fā)上菇绵,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音镇眷,去河邊找鬼咬最。 笑死,一個胖子當(dāng)著我的面吹牛欠动,可吹牛的內(nèi)容都是我干的永乌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼具伍,長吁一口氣:“原來是場噩夢啊……” “哼翅雏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起人芽,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤望几,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后萤厅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體橄抹,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年惕味,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼誓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赦拘,死狀恐怖慌随,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躺同,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布丸逸,位于F島的核電站蹋艺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏黄刚。R本人自食惡果不足惜捎谨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望憔维。 院中可真熱鬧涛救,春花似錦、人聲如沸业扒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽程储。三九已至蹭沛,卻和暖如春臂寝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摊灭。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工咆贬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人帚呼。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓掏缎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親煤杀。 傳聞我的和親對象是個殘疾皇子御毅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容