多线程学习(六)
線程的捕獲異常
由于線程的特性使得不能捕獲從現(xiàn)場逃逸的異常,一旦異常逃出run方法,他會向外傳播到控制臺,除非采取特別的方法來捕獲這些異常。
public class ExceptionThread implements Runnable {@Overridepublic void run() {throw new RuntimeException();}public static void main(String[] args) {Executors.newCachedThreadPool().execute(new ExceptionThread());} }異常傳播到控制臺:
使用try-catch 來捕獲異常:
public class ExceptionThread implements Runnable {@Overridepublic void run() {throw new RuntimeException();}public static void main(String[] args) {try{Executors.newCachedThreadPool().execute(new ExceptionThread());}catch (Exception e) {// TODO: handle exceptionSystem.out.println("catch the exception:"+e);}} }控制臺輸出:
證明確實沒有捕獲到異常 異常傳播到控制臺了
為了解決這個問題,要修改線程產(chǎn)生的方式。Thread.UncatchExceptionHandler 是java SE5的新的接口,它允許在每個Thread上附著一個異常處理器。現(xiàn)在我們要定制一個ThreadFactory來定制ExecutorService來定制產(chǎn)生的線程的屬性(這句話好拗口)
定制的ThreadFactory
public class HandlerThreadFactory implements ThreadFactory {@Overridepublic Thread newThread(Runnable r) {// TODO Auto-generated method stubThread t=new Thread(r);t.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {// TODO Auto-generated method stubSystem.out.println("catch the exception:"+e);}});return t;}}修改ExceptionThread
public class ExceptionThread implements Runnable {@Overridepublic void run() {throw new RuntimeException();}public static void main(String[] args) {Executors.newCachedThreadPool(new HandlerThreadFactory()).execute(new ExceptionThread());} }輸出:
通過輸出可以看到,異常已經(jīng)被捕獲了。
從上面的定制的ThreadFactory中我們是逐個線程設(shè)置異常處理器
如果要在線程中處處設(shè)置相同的處理器可以使用 設(shè)置默認線程異常處理器的方法:
轉(zhuǎn)載于:https://www.cnblogs.com/joeCqupt/p/6820150.html
總結(jié)
- 上一篇: 使用netstat命令查看端口的使用情况
- 下一篇: 3.5 实例讲解Lucene索引的结构设