zoukankan      html  css  js  c++  java
  • 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,然后又将其放弃。

  • 相关阅读:
    jQuery对象和DOM对象
    虚拟主机的部署(Apache)
    事件流:事件冒泡和事件捕获
    ThinkPHP
    级联下拉列表
    今日份抽自己!!!
    c++中关于输入字符数组的一些问题
    今日新知(关于递归中变量的声明)
    格子游戏(并查集)
    1.3-14大象喝水
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/2078289.html
Copyright © 2011-2022 走看看