-1

我正在使用停止线程执行,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

4 回答 4

1

Thread.interrupt() 将真正中断实际检查该状态的操作(例如,可中断的 I/O 操作或一些明确检查 isInterrupted() 的用户代码,原则上您在引用的代码中所做的那样)。

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

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

换句话说,您将计数器递减 10,000 次的任务发生得如此之快,以至于从所有意图和目的来看,它几乎不会被视为“可中断任务”。在实践中,所有 10,000 次递减都将在另一个线程有机会调用 interrupt() 之前发生,或者它们不会。

于 2012-12-10T04:39:17.350 回答
1

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

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

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

如果设置了线程的中断状态并且该线程调用了等待、睡眠或加入,则中断状态被清除并抛出 InterruptedExcepion。

于 2012-12-10T04:40:04.747 回答
0

我的疑问是 Thread.interrupt 仅设置中断标志或它真的停止执行。

它执行前者......或在某些情况下引发“中断”异常。

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

通常,您不能安全地停止或终止未检查其中断标志的正在运行的线程。类中有一些不推荐使用的方法Thread,但您应该避免使用它们,因为它们显然不安全。(要了解为什么使用 Thread 方法 javadocs ...以及它链接到的常见问题解答。)

于 2012-12-10T05:23:17.940 回答
0

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

我无法检查 Thread.isInterrupted() 那么如果线程被中断,则跳出循环。我不能这样做。

为什么不?

例如

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
    }
}
于 2012-12-10T04:17:01.420 回答