一:为什么要单独讲多线程的异常捕捉呢?
先看个例子:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
在run中手动抛出了一个运行时异常,在main中启动线程,catch语句块中捕捉下异常,捕捉到打印一句话。运行结果如下图:
发现异常被抛到了控制台,没有打印catch块中的语句。
结论:多线程运行不能按照顺序执行过程中捕获异常的方式来处理异常,异常会被直接抛出到控制台(由于线程的本质,使得你不能捕获从线程中逃逸的异常。一旦异常逃逸出任务的run方法,它就会向外传播到控制台,除非你采用特殊的形式捕获这种异常。),这样会让你很头疼,无法捕捉到异常就无法处理异常而引发的问题。
于是,我们一定会想如何在多线程中捕捉异常呢?
二、多线程中捕捉异常
我们来按照下面的步骤完成这次实验:
1.定义异常处理器
要求,实现 Thread.UncaughtExceptionHandler的uncaughtException方法,如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2.定义使用该异常处理器的线程工厂
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
3.定义一个任务,让其抛出一个异常
?
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
4.调用实验
?
1 2 3 4 5 6 7 8 9 |
|
运行结果如下图:
三、结论
在java中要捕捉多线程产生的异常,需要自定义异常处理器,并设定到对应的线程工厂中(即第一步和第二步)。
四、拓展
如果你知道将要在代码中处处使用相同的异常处理器,那么更简单的方式是在Thread类中设置一个静态域,并将这个处理器设置为默认的未捕获处理器。
这个处理器只有在不存在线程专有的未捕获异常处理器的情况下才会被调用。
?
1 2 3 4 5 |
|
以上就是本文针对Java多线程之多线程的异常捕捉的全部内容,本文如有理解错误地方,欢迎批评改正。
本文链接:https://my.lmcjl.com/post/14198.html
4 评论