1.7.3能停止的线程——异常法

/**
 * MyThread线程测试
 * @author wuyoushan
 * @date 2017/3/21.
 */
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));
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) {
        try {
            MyThread myThread=new MyThread();
            myThread.start();
            Thread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

程序运行结果:

i=274421
i=274422
i=274423
i=274424
i=274425
i=274426
已经是停止状态了!我要退出了!
end

上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。示例如下:

/**
 * MyThread线程测试
 * @author wuyoushan
 * @date 2017/3/21.
 */
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又继续运行,线程并未停止!");
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) {
        try {
            MyThread myThread=new MyThread();
            myThread.start();
            Thread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

运行结果如下:

i=308968
i=308969
i=308970
i=308971
i=308972
i=308973
已经是停止状态了!我要退出了!
我被输出,如果此代码是for又继续运行,线程并未停止!
end

那该如何解决语句继续运行的问题呢?看一下更新后的代码。

/**
 * MyThread线程测试
 * @author wuyoushan
 * @date 2017/3/21.
 */
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();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) {
        try {
            MyThread myThread=new MyThread();
            myThread.start();
            Thread.sleep(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end");
    }
}

运行结果如下:

i=162100
i=162101
i=162102
i=162103
i=162104
i=162105
i=162106
已经是停止状态了!我要退出了!
进入MyThread.java类run方法中的catch了!
end
java.lang.InterruptedException
    at wys.test.MyThread.run(MyThread.java:18)

摘选自 java多线程核心编程技术-1.7.3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、进程和线程 进程 进程就是一个执行中的程序实例,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。...
    阿敏其人阅读 7,414评论 0 13
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,208评论 1 15
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 12,080评论 3 87
  • 小诗几首 文/婉君 @风华 风,掏出一面镜子 细心地涂抹 媚眼一拋,春就醉了 @春天来了 燕子剪开三月 梦 逮雨就...
    林紫衣阅读 2,738评论 0 2
  • 今天在书店看到了一个关于汉族为什么热爱红色的说法。讲了汉族人为什么热爱红色,红色又为什么代表了喜庆。 第一,血液是...
    小草的森林阅读 1,315评论 0 0

友情链接更多精彩内容