Java并发学习之处理非正常的线程终止
一.如何处理非正常的线程终止
我们都知道。当单线程的控制台程序由于发生了一个未捕获的异常而终止时,程序将停止运行,并产生与程序正常输出非常不同的栈追踪信息。
但是, 在并发程序中,单个线程的故障很有可能不会影响到整体,而这时的控制台中可能会输出栈追踪信息,但是没人看去看它,就相当于这个异常被忽略!!
但是,我们有应对的方法嘿嘿嘿
导致线程提前死亡的最主要的原因其实就是RuntimeException. 因为一般的RuntimeException是不可捕获的,它们不会再调用栈中逐层传递,而是默认地在控制台中输出栈追踪信息,并终止线程,线程非正常退出地后果可能是良性的,也可能是恶性的。
注意:任何代码都可能会抛出RuntimeException。每当调用一个方法时,都要对它的行为保持怀疑,不要盲目地认为它一定会正常返回,或者一定会抛出在方法头中声明的已检查类型。 对调用的代码越不熟悉,就越应该对其代码行为保持怀疑。
所以我们有下面的应对策略:
1)如果任务抛出了一个未检查异常,那么它将使线程终结,但它会首先通知框架该线程已经终结,然后框架可能会用新的线程来代替这个工作线程。
public void run