日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

捕获线程中的异常

發布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 捕获线程中的异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

由于線程的本質特性,使得你不能捕獲從線程中逃逸的異常。一旦異常逃出任務的run()方法它就會向外傳播到控制臺,除非你采取特殊的步驟捕獲這種錯誤的異常。在Java SE5之前,你可以使用線程組來捕捉這種異常,但是有了Java SE5,就可以用Executor來解決這個問題了。

下面的任務總是會拋出一個異常,該異常會傳播到其run()方法的外部,并且main()展示了當你運行它時所發生的事情:

import?java.util.concurrent.ExecutorService; import?java.util.concurrent.Executors;public?class?ExceptionThread?implements?Runnable?{public?void?run()?{throw?new?RuntimeException();}public?static?void?main(String[]?args)?{ExecutorService?service?=?Executors.newCachedThreadPool();service.execute(new?ExceptionThread());} }

輸出如下:

Exception?in?thread?"pool-1-thread-1"?java.lang.RuntimeExceptionat?com.abc.thread.ExceptionThread.run(ExceptionThread.java:6)at?java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at?java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at?java.lang.Thread.run(Thread.java:745)

將main的主體放在try-catch語句塊中也是沒有作用的:

import?java.util.concurrent.ExecutorService; import?java.util.concurrent.Executors;public?class?ExceptionThread?implements?Runnable?{public?void?run()?{throw?new?RuntimeException();}public?static?void?main(String[]?args)?{try?{ExecutorService?service?=?Executors.newCachedThreadPool();service.execute(new?ExceptionThread());}?catch?(RuntimeException?e)?{System.out.println("Catched?Runtime?Exception.");}} }

這將產生于前面示例相同的結果:未捕獲的異常。

為了解決這個問題,我們要修改Executor產生線程的方式。Thread.UncaughtExceptionHandler是Java SE5中的新接口,它允許你在每個Thread對象上都附著一個異常處理器。Thread.UncaughtExceptionHandler.uncaughtException()會在線程因未捕獲的異常而臨近死亡時被調用。為了使用它,我們創建了一個新類型的ThreadFactory,它將在每個新創建的Thread對象上附著一個Thread.UncaughtExceptionHandler。

import?java.util.concurrent.ExecutorService; import?java.util.concurrent.Executors; import?java.util.concurrent.ThreadFactory;public?class?ExceptionThread2?implements?Runnable?{public?void?run()?{throw?new?RuntimeException("NullPointer");}public?static?void?main(String[]?args)?{ThreadFactory?tFactory?=?new?MyThreadFactory();ExecutorService?service?=?Executors.newCachedThreadPool(tFactory);Runnable?task?=?new?ExceptionThread2();service.execute(task);} }class?MyUncaughtExceptionHandler?implements?Thread.UncaughtExceptionHandler?{//?處理從線程里拋出來的異常。public?void?uncaughtException(Thread?t,?Throwable?e)?{System.out.println("Catched?Throwable:?"?+?e.getClass().getSimpleName()?+?",?"?+?e.getMessage());} }class?MyThreadFactory?implements?ThreadFactory?{//?重新組織創建線程的方式public?Thread?newThread(Runnable?r)?{Thread?t?=?new?Thread(r);//?為每一個線程都綁定一個異常處理器。t.setUncaughtExceptionHandler(new?MyUncaughtExceptionHandler());System.out.println("Thread["?+?t.getName()?+?"]?created.");return?t;} }

執行的結果如下:

可以看到,線程池中有2個線程,當一個線程發生異常時,該異常被捕捉了。

上面的示例使得你可以按照具體情況(在newThread()方法中使用if, case等語句)為每個線程逐個的設置處理器。如果你知道將要在代碼中處處使用相同的異常處理器,那么更簡單的方式是在Thread類中設置一個靜態域,并將這個處理器設置為默認的處理器即可:

import?java.util.concurrent.ExecutorService; import?java.util.concurrent.Executors;public?class?SettingDefaultHandler?{public?static?void?main(String[]?args)?{//?為線程設置默認的異常處理器。Thread.setDefaultUncaughtExceptionHandler(new?MyUncaughtExceptionHandler());ExecutorService?exec?=?Executors.newCachedThreadPool();exec.execute(new?ExceptionThread2());} }

這個處理器只有在不存在線程專有的未捕獲異常處理器的情況下才會被調用。系統會檢查線程專有版本,如果沒有發現,則檢查線程組是否有專有的uncaughtException()方法,如果也沒有,才會調用defaultUncaughtExceptionHandler。


轉載于:https://my.oschina.net/itblog/blog/502479

總結

以上是生活随笔為你收集整理的捕获线程中的异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天做天天爱天天做 | 一级色网站 | 一区二区在线观看视频 | 日韩中文视频 | 亚洲视频在线观看一区二区 | 免费又黄又爽又猛大片午夜 | 日本一区二区三区精品 | 国产18在线观看 | 日韩精选av | 女人张开双腿让男人捅 | 中文字幕不卡在线播放 | 中文字幕在线播放一区二区 | 亚洲精品成人电影 | 99精品国产成人一区二区 | 久久亚洲综合网 | 少妇光屁股影院 | 美女隐私无遮挡 | a级免费视频 | 欧美日韩免费视频 | 国产精品三级视频 | 日韩欧美中文字幕一区二区三区 | 痴汉电车在线观看 | 一级片免费看视频 | 碰在线视频 | 黄色片网站在线 | 国产精品国产三级国产播12软件 | 97超碰人人网| 女人被灌满精子 | 亚洲人成无码网站久久99热国产 | 毛片毛片毛片毛片毛片 | av看片网站| 丰满白嫩尤物一区二区 | 大胸美女网站 | 国外成人性视频免费 | 日韩视频在线免费播放 | 久久成人福利 | 天堂网站 | 国产精品久久久久久av | 国产a自拍 | 国产白丝袜美女久久久久 | 男女高h视频 | 一区二区三区久久久久 | 精品乱子伦一区二区 | xxxxxx黄色| 一区二区三区在线观看免费 | 91久久精品国产91久久性色tv | 99爱免费 | 好色婷婷 | 五月天校园春色 | 国产性猛交xxxx免费看久久 | 久久久免费观看视频 | 网友自拍咪咪爱 | 久久国产香蕉视频 | 亚洲欧美另类日韩 | 极品色综合| 久久久久久福利 | 一本一道波多野结衣一区二区 | 亚洲视频在线观看 | 黄色网页免费看 | 羽月希奶水一区二区三区 | 在线视频污| 日韩av在线免费看 | 中文字幕一区二区三三 | 久久理论电影 | 日韩少妇中文字幕 | 国产精品另类 | 91麻豆精品国产91 | 一区二区三区免费播放 | aaa亚洲精品| jizz在线观看视频 | 性高跟鞋xxxxhd人妖 | 色综合av | 国产黄色av片 | 国产人与zoxxxx另类 | 亚洲成人自拍 | 琪琪av在线 | 一区二区三区国产在线观看 | 亚洲射射 | 污网站在线观看免费 | 精精国产xxxx视频在线播放 | 天天色天天射天天操 | 在线免费观看日韩 | 欧美日本一道 | 九九影院最新理论片 | 性做久久久久久久久久 | 香港三日本8a三级少妇三级99 | 欧美天堂在线观看 | 又爽av| 国产免费一区二区三区最新6 | 亚洲在线不卡 | 污污视频免费看 | 麻豆国产尤物av尤物在线观看 | 国产乱码精品一区二区 | 亚洲成人高清在线观看 | www.youjizz.com在线 | 蜜桃视频一区二区三区 | 开心激情网五月天 | 第一章婶婶的性事 | 超碰伊人|