激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java多線程之多線程異常捕捉

Java多線程之多線程異常捕捉

2020-01-03 14:43brolanda JAVA教程

在java多線程程序中,所有線程都不允許拋出未捕獲的checked exception,也就是說各個(gè)線程需要自己把自己的checked exception處理掉,通過此篇文章給大家分享Java多線程之多線程異常捕捉,需要的朋友可以參考下

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

先看個(gè)例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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){
    //就算把線程的執(zhí)行語句放到try-catch塊中也無濟(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)線程,catch語句塊中捕捉下異常,捕捉到打印一句話。運(yùn)行結(jié)果如下圖:

Java多線程之多線程異常捕捉

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

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

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

二、多線程中捕捉異常

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

  1.定義異常處理器

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

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

  2.定義使用該異常處理器的線程工廠

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
 * 第二步:定義線程工廠
 * 線程工廠用來將任務(wù)附著給線程,并給該線程綁定一個(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è)定線程工廠的異常處理器
    System.out.println("eh="+t.getUncaughtExceptionHandler());
    return t;
  }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
 * 第三步:我們的任務(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)

?
1
2
3
4
5
6
7
8
9
/*
 * 第四步:使用線程工廠創(chuàng)建線程池,并調(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é)果如下圖:

Java多線程之多線程異常捕捉

三、結(jié)論

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

四、拓展

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

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

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

 

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人不卡在线观看 | 国产成人免费高清激情视频 | 久久久久久久久浪潮精品 | 久久亚洲春色中文字幕久久 | 视频一区 在线 | 久久久久久亚洲综合影院红桃 | 在线一级片| 国产成人免费高清激情视频 | 亚洲国产精品二区 | 欧美日韩在线播放一区 | 全黄裸片武则天一级第4季 偿还电影免费看 | 在线观看国产免费视频 | 日韩黄色精品视频 | 国产精品一区99 | 黄色影院一级片 | 少妇色诱麻豆色哟哟 | 精品一区二区久久久久久久网精 | 国产精品视频在 | 欧日韩 | 久久伊 | 嫩草影院在线观看网站成人 | 免费观看三级毛片 | 婷婷中文字幕一区二区三区 | 中国漂亮护士一级a毛片 | 操毛片| 久久蜜桃香蕉精品一区二区三区 | 国产午夜精品久久久 | 日日鲁夜夜视频热线播放 | 国产91久久久久 | a视频在线免费观看 | 国产理论视频在线观看 | 亚洲成人黄色片 | 亚洲第一成人久久网站 | 依人九九宗合九九九 | 黄色成人av在线 | 欧美18一12sex性处hd | 国产精品久久久毛片 | 中文字幕亚洲情99在线 | 一区二区久久电影 | 久久99精品久久久久久秒播蜜臀 | 免费观看欧美一级片 |