《Java多线程编程核心技术(第2版)》 —1.11.3 能停止的线程—异常法

举报
华章计算机 发表于 2020/02/08 15:11:10 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.11.3节,作者是高洪岩。

1.11.3 能停止的线程—异常法

根据前面所学知识,只需要通过线程的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所示。

 image.png

图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所示。

 image.png

图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.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.11节介绍的第三种停止线程的方法—使用interrupt()方法中断线程。

 

 image.png

图1-46 线程正确停止


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。