最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線(xiàn)程之多線(xiàn)程異常捕捉

 更新時(shí)間:2015年08月13日 11:16:53   作者:brolanda  
在java多線(xiàn)程程序中,所有線(xiàn)程都不允許拋出未捕獲的checked exception,也就是說(shuō)各個(gè)線(xiàn)程需要自己把自己的checked exception處理掉,通過(guò)此篇文章給大家分享Java多線(xiàn)程之多線(xiàn)程異常捕捉,需要的朋友可以參考下

  一:為什么要單獨(dú)講多線(xiàn)程的異常捕捉呢?

先看個(gè)例子:

public class ThreadException implements Runnable{
  @Override
  public void run() {
    throw new RuntimeException();
  }
  //現(xiàn)象:控制臺(tái)打印出異常信息,并運(yùn)行一段時(shí)間后才停止
  public static void main(String[] args){
    //就算把線(xiàn)程的執(zhí)行語(yǔ)句放到try-catch塊中也無(wú)濟(jì)于事
    try{
      ExecutorService exec = Executors.newCachedThreadPool();
      exec.execute(new ThreadException());
    }catch(RuntimeException e){
      System.out.println("Exception has been handled!");
    }
  }
}

  在run中手動(dòng)拋出了一個(gè)運(yùn)行時(shí)異常,在main中啟動(dòng)線(xiàn)程,catch語(yǔ)句塊中捕捉下異常,捕捉到打印一句話(huà)。運(yùn)行結(jié)果如下圖:

  發(fā)現(xiàn)異常被拋到了控制臺(tái),沒(méi)有打印catch塊中的語(yǔ)句。

  結(jié)論:多線(xiàn)程運(yùn)行不能按照順序執(zhí)行過(guò)程中捕獲異常的方式來(lái)處理異常,異常會(huì)被直接拋出到控制臺(tái)(由于線(xiàn)程的本質(zhì),使得你不能捕獲從線(xiàn)程中逃逸的異常。一旦異常逃逸出任務(wù)的run方法,它就會(huì)向外傳播到控制臺(tái),除非你采用特殊的形式捕獲這種異常。),這樣會(huì)讓你很頭疼,無(wú)法捕捉到異常就無(wú)法處理異常而引發(fā)的問(wèn)題。

  于是,我們一定會(huì)想如何在多線(xiàn)程中捕捉異常呢?

二、多線(xiàn)程中捕捉異常

  我們來(lái)按照下面的步驟完成這次實(shí)驗(yàn):

  1.定義異常處理器

   要求,實(shí)現(xiàn) Thread.UncaughtExceptionHandler的uncaughtException方法,如下:

/*
 * 第一步:定義符合線(xiàn)程異常處理器規(guī)范的“異常處理器”
 * 實(shí)現(xiàn)Thread.UncaughtExceptionHandler規(guī)范
 */
class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
  /*
   * Thread.UncaughtExceptionHandler.uncaughtException()會(huì)在線(xiàn)程因未捕獲的異常而臨近死亡時(shí)被調(diào)用
   */
  @Override
  public void uncaughtException(Thread t, Throwable e) {
    System.out.println("caught  "+e);
  }
}

  2.定義使用該異常處理器的線(xiàn)程工廠

/*
 * 第二步:定義線(xiàn)程工廠
 * 線(xiàn)程工廠用來(lái)將任務(wù)附著給線(xiàn)程,并給該線(xiàn)程綁定一個(gè)異常處理器
 */
class HanlderThreadFactory implements ThreadFactory{
  @Override
  public Thread newThread(Runnable r) {
    System.out.println(this+"creating new Thread");
    Thread t = new Thread(r);
    System.out.println("created "+t);
    t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());//設(shè)定線(xiàn)程工廠的異常處理器
    System.out.println("eh="+t.getUncaughtExceptionHandler());
    return t;
  }
}

  3.定義一個(gè)任務(wù),讓其拋出一個(gè)異常

/*
 * 第三步:我們的任務(wù)可能會(huì)拋出異常
 * 顯示的拋出一個(gè)exception
 */
class ExceptionThread implements Runnable{
  @Override
  public void run() {
    Thread t = Thread.currentThread();
    System.out.println("run() by "+t);
    System.out.println("eh = "+t.getUncaughtExceptionHandler());
    throw new RuntimeException();
  }
}

  4.調(diào)用實(shí)驗(yàn)

/*
 * 第四步:使用線(xiàn)程工廠創(chuàng)建線(xiàn)程池,并調(diào)用其execute方法
 */
public class ThreadExceptionUncaughtExceptionHandler{
  public static void main(String[] args){
    ExecutorService exec = Executors.newCachedThreadPool(new HanlderThreadFactory());
    exec.execute(new ExceptionThread());
  }
}

  運(yùn)行結(jié)果如下圖:

三、結(jié)論

  在java中要捕捉多線(xiàn)程產(chǎn)生的異常,需要自定義異常處理器,并設(shè)定到對(duì)應(yīng)的線(xiàn)程工廠中(即第一步和第二步)。

四、拓展

  如果你知道將要在代碼中處處使用相同的異常處理器,那么更簡(jiǎn)單的方式是在Thread類(lèi)中設(shè)置一個(gè)靜態(tài)域,并將這個(gè)處理器設(shè)置為默認(rèn)的未捕獲處理器。

這個(gè)處理器只有在不存在線(xiàn)程專(zhuān)有的未捕獲異常處理器的情況下才會(huì)被調(diào)用。

public static void main(String[] args){
    Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
    ExecutorService exec =Executors.newCachedThreadPool();
    exec.execute(new ExceptionThread());
}

以上就是本文針對(duì)Java多線(xiàn)程之多線(xiàn)程的異常捕捉的全部?jī)?nèi)容,本文如有理解錯(cuò)誤地方,歡迎批評(píng)改正。

相關(guān)文章

  • Spring?Boot中的max-http-header-size配置方式

    Spring?Boot中的max-http-header-size配置方式

    這篇文章主要介紹了Spring?Boot中的max-http-header-size配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 基于slf4j日志MDC輸出格式的問(wèn)題

    基于slf4j日志MDC輸出格式的問(wèn)題

    這篇文章主要介紹了基于slf4j日志MDC輸出格式的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java微信支付之服務(wù)號(hào)支付代碼示例

    Java微信支付之服務(wù)號(hào)支付代碼示例

    這篇文章主要介紹了Java微信支付之服務(wù)號(hào)支付代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java調(diào)用python代碼的五種方式總結(jié)

    Java調(diào)用python代碼的五種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java調(diào)用python代碼的五種方式,在Java中調(diào)用Python函數(shù)的方法有很多種,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java打包Jar包后使用腳本執(zhí)行

    Java打包Jar包后使用腳本執(zhí)行

    本文詳細(xì)講解了Java打包Jar包后使用腳本執(zhí)行的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Springcloud Nacos基本操作代碼實(shí)例

    Springcloud Nacos基本操作代碼實(shí)例

    這篇文章主要介紹了Springcloud Nacos基本操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 通過(guò)實(shí)例解析Spring argNames屬性

    通過(guò)實(shí)例解析Spring argNames屬性

    這篇文章主要介紹了通過(guò)實(shí)例解析Spring argNames屬性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • mybatis 有時(shí)update語(yǔ)句執(zhí)行無(wú)效的解決方案

    mybatis 有時(shí)update語(yǔ)句執(zhí)行無(wú)效的解決方案

    這篇文章主要介紹了在項(xiàng)目里mybatis有時(shí)update語(yǔ)句執(zhí)行無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Boot自定義配置實(shí)現(xiàn)IDE自動(dòng)提示功能

    Spring Boot自定義配置實(shí)現(xiàn)IDE自動(dòng)提示功能

    這篇文章主要介紹了Spring Boot自定義配置實(shí)現(xiàn)IDE自動(dòng)提示功能,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • SpringBoot項(xiàng)目中使用Sharding-JDBC實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟

    SpringBoot項(xiàng)目中使用Sharding-JDBC實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟

    Sharding-JDBC是一個(gè)分布式數(shù)據(jù)庫(kù)中間件,它不僅支持?jǐn)?shù)據(jù)分片,還可以輕松實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離,本文介紹如何在Spring Boot項(xiàng)目中集成Sharding-JDBC并實(shí)現(xiàn)讀寫(xiě)分離的詳細(xì)步驟,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

黄平县| 本溪市| 新邵县| 维西| 尼勒克县| 安泽县| 连山| 湖州市| 乐亭县| 平安县| 沙坪坝区| 贵州省| 凤台县| 石家庄市| 武安市| 普宁市| 崇文区| 垫江县| 光泽县| 邹平县| 依兰县| 辽宁省| 秦皇岛市| 平和县| 莱州市| 金川县| 晋州市| 兴仁县| 博客| 尚义县| 柯坪县| 尖扎县| 尼玛县| 丰原市| 布尔津县| 绩溪县| 寿宁县| 兴山县| 鸡泽县| 公安县| 泰和县|