Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.11.7 方法stop()与java.lang.ThreadDeath异常

创建测试项目killSelf,文件MyThread.java代码如下:


package test;

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            Thread.sleep(2000);
            int i = 100;
            System.out.println("begin");
            if (i == 100) {
                this.stop();
            }
            System.out.println("  end");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

创建运行类代码如下:


package test;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        MyThread thread = new MyThread();
        thread.start();
    }
}

程序运行结果如下:


begin

线程MyThread被自身调用stop()方法暴力停止。

自身调用stop()方法时会抛出java.lang.ThreadDeath异常,但在默认的情况下,此异常不需要显式捕捉。

创建测试项目runMethodUseStopMethod,文件MyThread.java代码如下:


package testpackage;

public class MyThread extends Thread {
@Override
public void run() {
    try {
        this.stop();
    } catch (ThreadDeath e) {
        System.out.println("进入了catch()方法!");
        e.printStackTrace();
    }
}
}

文件Run.java代码如下:


package test.run;

import testpackage.MyThread;

public class Run {
public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
}
}

程序运行结果如图1-51所示。

图1-51 进入了catch异常

线程自身调用stop()方法会进入catch(ThreadDeath e)代码块,外界调用stop()方法后线程内部也会进入catch (Thread-Death e)代码块中,下面进行测试。

创建测试项目ThreadDeathTest,创建测试类代码如下:


package test;

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            for (int i = 0; i < 5000000; i++) {
                System.out.println(i + 1);
            }
        } catch (ThreadDeath e) {
            e.printStackTrace();
            System.out.println("进入了MyThread中的catch (ThreadDeath e)代码块中");
        }
    }
}

创建运行类代码如下:


package test;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(1000);
        try {
            thread.stop();
        } catch (ThreadDeath e) {
            System.out.println("进入了Test类中的catch (ThreadDeath e)代码块中");
            e.printStackTrace();
        }
    }
}

程序运行结果如下:


198012
198013
198014198014进入了MyThread中的catch (ThreadDeath e)代码块中
java.lang.ThreadDeath
    at java.lang.Thread.stop(Unknown Source)
    at test.Test.main(Test.java:9)

控制台输出如下信息:


进入了MyThread中的catch (ThreadDeath e)代码块中

在外界对线程对象调用stop()方法后,线程内部会抛出ThreadDeath异常。外界不会抛出ThreadDeath异常,因为信息“进入了Test类中的catch (ThreadDeath e)代码块中”并没有输出。