ThreadDeath

/**  
 * 截获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,然后又将其放弃。

 

 

 

posted @ 2011-06-11 12:40  规格严格-功夫到家  阅读(1292)  评论(0编辑  收藏  举报