关于第二种情况的判断interrupt

来源:5-4 遇到阻塞

你的益达91

2019-08-16

老师,第二种情况下循环结束休眠去掉判断interrupt的条件(如下代码)也可以结束,而且interrupt的时候while循环已经结束了,也不会再进行判断了,为什么要加上呢?

public static void main(String[] args) throws InterruptedException {
        Runnable runnable = new Runnable() {
            public void run() {
                int num = 0;
                try {
                    while (num <= 300 ) {
                        if (num % 100 == 0) {
                            System.out.println(num + "是100的倍数");
                        }
                        num++;
                    }
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
        Thread.sleep(500);
        thread.interrupt();
    }
写回答

2回答

悟空

2019-08-17

这里加上!Thread.currentThread().isInterrupted()是我们编写多线程代码时候的一个良好的习惯,可以应对不同的业务场景。

在本例中,如果判断条件是num <= 300,那么确实在interrupt的时候while循环已经结束了,不过这里的判断条件很可能会根据业务需求做出改变,例如改成num <= 30000,或者是其他的耗时操作,那么interrupt就会发生在while期间,如果不加上!Thread.currentThread().isInterrupted(),就会导致只能等while所有循环都结束后才能发现中断信号,这样的响应速度就太慢了,所以通常在每次while循环时,都应该加上检查中断信号的逻辑。

1
0

无心铁憨憨

2019-08-16

这应该算是一种好的习惯,现在所有代码与线程都是自己编写的,所以你可以很肯定的知道,在执行while的时候是不会被中断的,但如果你有调用了别人的代码的时候,你就无法确定你所调用的代码是否有设置中断,而你的逻辑是希望线程没有被中断的情况下去执行,一旦碰到中断,剩下的我就不执行了。

所以,在这段自己写的代码里,加不加上判断线程中断状态的代码,都是可以的,结果不会产生变化

0
1
悟空
说得好
2019-08-17
共1条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程