java 线程:Thread.interrupt() 不工作

java thread: Thread.interrupt() not working

我需要终止一个未在我的代码中创建的线程。也就是说,线程对象是由api(Eclipse JFace)创建的。这是我的代码

ProgressMonitorDialog dialog = new ProgressMonitorDialog(null);
try {
        IRunnableWithProgress rp = new IRunnableWithProgress(){

            @Override
            public void run(IProgressMonitor monitor)
                    throws InvocationTargetException, InterruptedException {
                Thread.sleep(3000);

                Thread t = Thread.currentThread();
                t.getThreadGroup().list();

                t.interrupt();
            }
        };
        dialog.run(true, true, rp);
}
catch (Exception e) {
    e.printStackTrace();
}

Thread.currentThread() returns 一个名为 "ModalContext" 的线程。 t.getThreadGroup().list()行returns以下数据:

...
Thread[qtp1821431-38,5,main]
Thread[qtp1821431-39,5,main]
Thread[qtp1821431-40,5,main]
Thread[qtp1821431-42 Acceptor0 SelectChannelConnector@0.0.0.0:18080,5,main]
Thread[DestroyJavaVM,5,main]
Thread[ModalContext,5,main]

变量 "dialog" 和 "rp" 没有引用它们的 运行nable 对象。而且他们没有任何关闭或取消的方法。所以我想直接杀死那个线程"ModalContext"。调用 t.interrupt() 不起作用。线程 MoadlContext 继续 运行。我怎样才能杀死线程?谢谢

t.interrupt() 实际上并没有立即中断线程,它只是更新线程的中断状态。如果您的线程包含轮询中断状态的方法(即 sleep ),那么线程将被中断,否则线程将简单地完成执行并且中断状态将被 ignored.

考虑以下示例,

class RunMe implements Runnable {

    @Override
    public void run() {
        System.out.println("Executing :"+Thread.currentThread().getName());
        for(int i = 1; i <= 5; i++) {
            System.out.println("Inside loop for i = " +i);
        }
        System.out.println("Execution completed");
    }

}

public class Interrupted {

    public static void main(String[] args) {
        RunMe runMe = new RunMe();
        Thread t1 = new Thread(runMe);
        t1.start();
        t1.interrupt();//interrupt ignored
        System.out.println("Interrupt method called to interrupt t1");
    }
}

输出

Interrupt method called to interrupt t1
Executing :Thread-0
Inside loop for i = 1
Inside loop for i = 2
Inside loop for i = 3
Inside loop for i = 4
Inside loop for i = 5
Execution completed

现在只需在 run 中添加 Thread.sleep(200);,您将看到 InterruptedException

interrupt method 不会终止线程。它在 Thread 上设置 "interrupted" 状态,如果它正在休眠或等待 I/O,那么它调用的那个方法将抛出一个 InterruptedException.

但是,您在 sleep 完成后在当前线程上调用 interrupt,因此除了设置 "interrupted" 状态外什么都不做。

您可以执行以下操作之一:

  1. Thread 调用 interrupt Thread。在 run() 中,如果捕获到 InterruptedExceptioninterrupted() returns true.
  2. ,则让方法完成
  3. 声明一个 volatile boolean 变量(比如 isRunning),在创建的线程中初始化为 true。如果它是 false,该线程将让 run() 方法完成。在适当的时候让另一个 Thread 将其设置为 false