/**
* 截获Thread.stop引起的ThreadDeath异常。<br>
* 我们理论上可以处理引起的stop异常信息。<br>
* 但是,异常可以发生在线程运行的任意一个点<br>
* 所有的同步方法和代码块都需要进行仔细的处理。<br>
* 而且线程在处理第一个ThreadDeath的时候可能再次发生ThradDeath<br>
* 所以清理工作必须一直做到成为为止,相关的处理代码将是异常的复杂。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class ThreadStopTestCatch {
private static Object lock = new Object();
private static int number = 0;
private static String name = "Name0";
public static void main(String[] args) {
ThreadStop t = new ThreadStop();
t.start();
ThreadRun t2 = new ThreadRun();
t2.start();
t.stop();
// t.stop();
}
static class ThreadRun extends Thread {
public void run() {
synchronized (lock) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("number=" + number);
System.out.println("name=" + name);
}
}
}
static class ThreadStop extends Thread {
public void run() {
synchronized (lock) {
try {
number++;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "Name" + number;
} catch (ThreadDeath td) {
number = 1;
// 假设线程stop的清理程序也需要一点时间才能完成。
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "Name" + number;
td.printStackTrace();
}
}
}
}
}
* 截获Thread.stop引起的ThreadDeath异常。<br>
* 我们理论上可以处理引起的stop异常信息。<br>
* 但是,异常可以发生在线程运行的任意一个点<br>
* 所有的同步方法和代码块都需要进行仔细的处理。<br>
* 而且线程在处理第一个ThreadDeath的时候可能再次发生ThradDeath<br>
* 所以清理工作必须一直做到成为为止,相关的处理代码将是异常的复杂。
*
* @author 老紫竹 JAVA世纪网(java2000.net)
*
*/
public class ThreadStopTestCatch {
private static Object lock = new Object();
private static int number = 0;
private static String name = "Name0";
public static void main(String[] args) {
ThreadStop t = new ThreadStop();
t.start();
ThreadRun t2 = new ThreadRun();
t2.start();
t.stop();
// t.stop();
}
static class ThreadRun extends Thread {
public void run() {
synchronized (lock) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("number=" + number);
System.out.println("name=" + name);
}
}
}
static class ThreadStop extends Thread {
public void run() {
synchronized (lock) {
try {
number++;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "Name" + number;
} catch (ThreadDeath td) {
number = 1;
// 假设线程stop的清理程序也需要一点时间才能完成。
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "Name" + number;
td.printStackTrace();
}
}
}
}
}
贴一个JDK文档,如果不抓取Error的话,是不会有任何错误信息,文档说明:
public class ThreadDeath
- extends Error
调用 Thread
类中带有零参数的 stop
方法时,受害线程将抛出一个 ThreadDeath
实例。
仅当应用程序在被异步终止后必须清除时才应该捕获这个类的实例。如果 ThreadDeath
被一个方法捕获,那么将它重新抛出非常重要,因为这样才能让该线程真正终止。
如果没有捕获 ThreadDeath
,则顶级错误处理程序不会输出消息。
虽然 ThreadDeath
类是“正常出现”的,但它只能是 Error
的子类而不是 Exception
的子类,因为许多应用程序捕获所有出现的 Exception
,然后又将其放弃。