上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)代码块中”并没有输出。