设为首页 加入收藏

TOP

Java Thread线程异常监控
2017-01-02 08:15:07 】 浏览:8642
Tags:Java Thread 线程 异常 监控

一、场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获。


示例1:多线程发生异常,无法使用try...catch捕获问题


运行结果:


1
Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
at threadtest.NoCaughtThread.run(NoCaughtThread.java:7)
at java.lang.Thread.run(Thread.java:724)


显然这并非程序设定异常捕获,此时try...catch无法捕获线程的异常。此时,如果线程因为异常而终止执行将无法检测到异常。究其原因Thread类run()方法是不抛出任何检查型异常的,而自身却可能因为一个异常而被中止。


二、解决方式大致有两种:① 在run()中设置对应的异常处理,主动方法来解决未检测异常;②Thread类API中提供Interface接口UncaughtExceptionHandler,该接口包含uncaughtException方法,它能检测出某个未捕获的异常而终结的情况;


示例2:主动的检测异常


运行结果:


1
==Exception: / by zero


此时是主动捕获异常并做处理,得到想要的结果。


示例3:Thread类API中提供UncaughtExceptionHandler接口捕获异常,要求检测线程异常,发生异常设置为重复调用三次之后结束线程。


运行结果:


==Exception: error
开始睡眠。
睡眠结束,control: 1
==Exception: error
开始睡眠。
睡眠结束,control: 2
==Exception: error
开始睡眠。
睡眠结束,control: 3
==Exception: error


此时,可以正常捕获线程因除数为零造成的中断。其中:


(1) 在Thread类API中提供Interface接口UncaughtExceptionHandler,该接口包含一个uncaughtException方法,它能检测出某个由于未捕获的异常而终结的情况。定义如下:


UncaughtExceptionHandler接口: public static interface Thread.UncaughtExceptionHandler


uncaughtException方法:public void uncaughtException(Thread t, Throwable e)


(2)uncaughtException方法会捕获线程的异常,此时需要覆写该方法设定自定义的处理方式。


(3) 设置UncaughtExceptionHandler异常处理:


方式一:通过Thread提供的静态static方法,设置默认异常处理:public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ux)


方式二:通过方法:public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)


(4) UncaughtExceptionHandler异常处理需要设置在run()方法内,否则无法捕获到线程的异常。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇JavaScript变量提升(Hoisting) 下一篇Java collection集合之 扑克牌游戏

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目