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

 

 

 

你可能感兴趣的:(thread)