上QQ阅读APP看书,第一时间看更新
1.11.4 能停止的线程——异常法
根据前面学过的知识点,只需要通过线程中的for语句来判断线程是否是停止状态即可判断后面的代码是否可运行,如果是停止状态,则后面的代码不再运行即可。
创建实验项目t13,类MyThread.java代码如下:
public class MyThread extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 500000; i++) { if (this.interrupted()) { System.out.println("已经是停止状态了!我要退出了!"); break; } System.out.println("i=" + (i + 1)); } } }
类Run.java代码如下:
public class Run { public static void main(String[] args) { try { MyThread thread = new MyThread(); thread.start(); Thread.sleep(2000); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end!"); } }
程序运行结果如图1-44所示。
图1-44 线程可以退出了
上面示例虽然停止了线程,但如果for语句下面还有语句,那么程序还会继续运行。创建测试项目t13forprint,类MyThread.java代码如下:
package exthread; public class MyThread extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 500000; i++) { if (this.interrupted()) { System.out.println("已经是停止状态了!我要退出了!"); break; } System.out.println("i=" + (i + 1)); } System.out.println("我被输出,如果此代码是for又继续运行,线程并未停止!"); } }
文件Run.java代码如下:
package test; import exthread.MyThread; import exthread.MyThread; public class Run { public static void main(String[] args) { try { MyThread thread = new MyThread(); thread.start(); Thread.sleep(2000); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end!"); } }
程序运行结果如图1-45所示。
图1-45 for后面的语句继续运行
如何解决语句继续运行的问题呢?看一下更新后的代码。
创建t13_1项目,类MyThread.java代码如下:
package exthread; public class MyThread extends Thread { @Override public void run() { super.run(); try { for (int i = 0; i < 500000; i++) { if (this.interrupted()) { System.out.println("已经是停止状态了!我要退出了!"); throw new InterruptedException(); } System.out.println("i=" + (i + 1)); } System.out.println("我在for下面"); } catch (InterruptedException e) { System.out.println("进MyThread.java类run方法中的catch了!"); e.printStackTrace(); } } }
注意
为了彻底中断线程,需要保证run()方法内部只有一个try-catch语句块,不要出现多个try-catch块并列的情况。
类Run.java代码如下:
package test; import exthread.MyThread; public class Run { public static void main(String[] args) { try { MyThread thread = new MyThread(); thread.start(); Thread.sleep(2000); thread.interrupt(); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("end!"); } }
运行结果如图1-46所示。
图1-46 运行结果
线程终于被正确停止了!此种方式就是前面章节介绍过的第三种停止线程的方法:使用interrupt方法中断线程。