java thread:Thread.interrupt()无效

时间:2015-09-09 18:24:35

标签: java multithreading swt eclipse-rcp

我需要杀死一个不是在我的代码中创建的线程。换句话说,线程对象是由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()返回名为“ModalContext”的线程。 line t.getThreadGroup()。list()返回以下数据:

...
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]

变量“对话框”和“rp”没有引用它们的可运行对象。他们没有任何方法可以关闭或取消。所以我想直接杀死那个帖子“ModalContext”。调用t.interrupt()不起作用。线程MoadlContext继续运行。我该如何杀死线程?感谢

2 个答案:

答案 0 :(得分:2)

t.interrupt()实际上并不会立即中断线程,只会更新线程的中断状态。如果你的线程包含轮询中断状态的方法(即sleep),那么线程将被中断,否则线程将完成执行并且中断状态将被忽略

考虑以下示例,

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

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

答案 1 :(得分:2)

interrupt method不会杀死该帖子。它在Thread上设置“中断”状态,如果它正在休眠或等待I / O,那么它正在调用的方法将抛出InterruptedException

但是,在interrupt完成后,您在当前线程上调用sleep,因此除了设置“已中断”状态外,此操作无效。

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

  1. Thread上进行另一次interrupt来电Thread。在run()中,如果抓住InterruptedExceptioninterrupted()返回true,请让方法完整。
  2. 声明在创建的线程中初始化为volatile boolean的{​​{1}}变量(例如,isRunning)。该线程将true方法完成,如果它是run()。让其他false在适当的时间将其设置为Thread