Thread.interrupt真的会停止程序执行吗?

时间:2012-12-10 04:15:01

标签: java multithreading thread-safety

我使用Thread.interrupt停止线程执行,但线程执行不会停止。它还在运行。

示例:

Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                    int i = 0;
                    while(i<10000){
                        if(Thread.currentThread().isInterrupted()){
                            System.out.println("Thread Interrupted but it still running");
                        }
                        System.out.println(++i);
                        try {
                            Thread.sleep(2);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
            }
        });
        t.start();
        t.interrupt();

我无法检查Thread.isInterrupted()然后线程是否中断突破循环。我不能这样做。在这里,我只是展示示例示例。

我的疑问是Thread.interrupt只是设置interrupted标记,或者它确实会停止执行。

对此有任何帮助将不胜感激。

如何停止线程执行或终止正在运行的线程?

4 个答案:

答案 0 :(得分:1)

Thread.interrupt()将真正中断实际检查该状态的操作(例如,可中断的I / O操作或者显式检查isInterrupted()的某些用户代码,原则上您在代码中执行引号)。

在您引用的具体示例中,您需要牢记:

  • 每个处理器核心以数十亿条指令的顺序执行 每秒;
  • 过程切换发生在数十到数百的数量级 每秒的次数。

换句话说,你减少10,000次计数器的任务是发生得如此之快的事情,以至于所有意图和目的,它几乎不会被注册为“可中断的任务”。实际上,要么所有10,000个减量都会在另一个线程有机会调用interrupt()之前发生,否则它们就不会发生。

答案 1 :(得分:1)

如果线程在等待,休眠或加入时被阻塞,则抛出InterruptedException,否则设置中断状态。

如果调用Thread.interrupted,则清除中断状态。

Thread.isInterrupted不会清除中断状态。

如果设置了线程的中断状态,并且该线程调用wait,sleep或join,则清除中断状态并抛出InterruptedExcepion。

答案 2 :(得分:0)

它只设置标志UNLESS当时正在执行可中断语句(例如,睡眠,等待)。现在你应该能够通过处理这两种情况来弄清楚如何停止线程。

  

如果线程被中断,我无法检查Thread.isInterrupted()   突破循环。我不能这样做。

为什么不呢?

E.g。

while(i<10000){
    if(Thread.currentThread().isInterrupted()){
        System.out.println("Thread Interrupted but it still running");
        return;    // HERE
    }
    System.out.println(++i);
    try {
        Thread.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
        return;    // HERE
    }
}

答案 3 :(得分:0)

  

我怀疑是Thread.interrupt只设置了中断标志,否则它确实会停止执行。

它会做前者......或在某些情况下抛出“中断”的例外。

  

如何停止线程执行或终止正在运行的线程?

通常,您不能安全地停止或终止未检查其中断标志的正在运行的线程。 Thread类上有一些已弃用的方法,但您应该避免使用它们,因为它们明显不安全。 (了解Thread方法javadocs的原因......以及它链接到的FAQ。)