Java多线程编程核心技术(第3版)
上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方法中断线程。