java线程: Thread.中断()不工作

标签 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”的线程。 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]

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

最佳答案

interrupt method不会杀死线程。它在 Thread 上设置“中断”状态,如果它正在 hibernate 或等待 I/O,则它调用的方法将抛出 InterruptedException

但是,您在 sleep 完成后在当前线程上调用了 interrupt,因此这只会设置“中断”状态。

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

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

关于java线程: Thread.中断()不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32486717/

相关文章:

c# - 多个线程中的for循环

java - “构建工作空间”遇到问题,信息不能为空

java - 如何创建带有允许多项选择的复选框的对话框

java - 无法通过互联网连接到 ServerSocket

java - `if ( x = 0 )` 曾经是 Java 可编译的吗

java - 异步任务发生异常

java - 使合成在 SWT 中可聚焦

java - 如何使用 getKeyStroke(String s) 方法?

java - 将多维数组中的第一个元素分配给一维数组

c# - 使用线程高效地处理消息?