线程停止的方法interrupt

    虽然线程方法里面有个方法为interrupt(),即线程中断,但是并不是调用了线程中断,线程就真的中断了,如果线程在sleep中,则会被异常捕获,例子如下:    

public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while (true) {
                    System.out.println(i);
                    i++;
                    if (Thread.currentThread().isInterrupted()) {
                        System.out.println("中断标识为真,我将中断等待");
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println("我被中断异常捕获");
                    }
                }
            }
        });
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
        Thread.sleep(20 * 1000);
    }

    运行结果:

191531_wbwa_3139515.png

    可以看到,程序并没有中断成功,反而被异常捕获,这时候,我们可以想到,在异常里执行中断,该线程才会中断下来:

public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while (true) {
                    System.out.println(i);
                    i++;
                    if (Thread.currentThread().isInterrupted()) {
                        System.out.println("中断标识为真,我将中断等待");
                        break;
                    }
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println("我被中断异常捕获");
                        // 在异常里面增加中断方法
                        Thread.currentThread().interrupt();
                    }
                }
            }
        });
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
        Thread.sleep(20 * 1000);
    }

    运行结果:

191941_GIQ8_3139515.png

    可以看到这个时候才真正中断下来。所以使用中断的时候,不但主线程要执行中断,而且在执行线程的重点异常处,也要增加中断。另外,如果线程在执行循环,则一定要增加if (thread.isInterrupted()),否则线程就算在异常里面又一次执行了中断,循环还是会继续执行,如下图:

public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                while (true) {
                    System.out.println(i);
                    i++;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        System.out.println("我被中断异常捕获");
                        // 在异常里面增加中断方法
                        Thread.currentThread().interrupt();
                    }
                }
            }
        });
        thread.start();
        Thread.sleep(3000);
        thread.interrupt();
        Thread.sleep(20 * 1000);
    }

    运行结果:

192505_JaGu_3139515.png

    因此如果有循环要记得判断一下中断标识。中断标识一种是直接调用isInterrupted()方法判断,另外还可以通过在线程里面设置一个volatile变量,通过修改这个变量来实现。

转载于:https://my.oschina.net/u/3139515/blog/1571291

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值