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

Java Thread.interrupt真的会停止程序执行吗?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我正在使用线程停止线程执行。中断,但线程执行不会停止。它还在运行 例如: Thread t = new Thread(new Runnable() { @Override public void run() { int i = 0; while(i<10000){ if(Thread.currentThread()

我正在使用
线程停止线程执行。中断
,但线程执行不会停止。它还在运行

例如:

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 t=新线程(new Runnable(){
@凌驾
公开募捐{
int i=0;

while(i它只设置标志,除非当时正在执行可中断语句(例如sleep、wait)。现在您应该能够通过处理这两种情况来解决如何停止线程

我无法检查线程。isInterrupted()然后如果线程被中断 打破循环,我不能这么做

为什么不呢

例如

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

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

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

换句话说,将计数器递减10000次的任务发生得如此之快,以至于无论出于何种目的,它都不会被注册为“可中断任务”。实际上,在另一个线程调用interrupt()之前,所有10000次递减都会发生如果线程在等待、睡眠或加入时被阻塞,则会抛出InterruptedException,否则会设置interrupted状态

如果调用Thread.Interrupted,中断状态将被清除

Thread.isInterrupted不清除中断状态

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

我的疑问是Thread.interrupt只是设置interrupted标志,或者它真的停止了执行

它执行前者…或者在某些情况下抛出“中断”异常

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


一般来说,您无法安全地停止或杀死未检查其中断标志的正在运行的线程。
thread
类上有一些已弃用的方法,但您应该避免使用它们,因为它们显然不安全。(要理解为什么线程方法是javadocs…以及它链接到的常见问题解答。)

可能重复:还请记住,在上述代码中,在检测到中断时确实需要中断循环。中断将导致isInterrupted()返回true(一次)或者导致睡眠被中断异常唤醒,但仅此而已。如果由于中断,您希望打破循环,那么您需要明确地这样做。尼尔谢谢。我只是给出了示例场景。这不是我面临的真实场景。对于您的观点,我们要检查
线程.isinterrupted
,并停止e所以…看看这里线程中断的一般性,否则,除非你能暴露出你所遇到的实际问题,否则很难做出回应。。。!
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
    }
}