【问题标题】:how to kill hung thread in java [duplicate]如何在java中杀死挂起的线程[重复]
【发布时间】:2026-01-03 21:20:09
【问题描述】:

我一直在尝试杀死由于大量 IO 操作而挂起的线程。 我本可以尝试 thread.destroythread.stop 但它们已被弃用 例如看看下面的代码

public class ThreadCheck {
private static int cnt = 0;
public static void main(String args[]) throws InterruptedException, ExecutionException {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Running tasks");
          while (condition)                             {
                // **** Some IO operation that take forever ****                
                System.out.println("iteration " + cnt++);
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Breaking loop");
                    return;
                }   
            }           
        }
    });
    t1.start();
    TimeUnit.SECONDS.sleep(5);
    t1.interrupt();
    System.out.println("thread destroyed..");

  }
}

问题是我添加了interrupt 调用,但它从未完成 IO 调用,所以在这种情况下我可以杀死线程

【问题讨论】:

  • 这取决于确切的 IO 操作。例如,如果您可以将代码更改为使用InterrptibleChannel,您将能够实现您所需要的。无论如何,IO 操作对于这个问题是必不可少的。
  • 是的,他^^^^说的!
  • @RealSkeptic 我正在读取一些 CSV 文件并将它们中的数据插入到数据库中,但有时这些 CSV 文件会损坏并且 IO 调用永远不会完成,在这种情况下,java 是否有任何我可以杀死的实现类似于 unix kill 命令中的线程
  • 或使用ExecutorService 并为您的方法创建超时。
  • @Nomad:是的,Thread 类有一个stop() 方法,您可以在Thread API 中找到它。但您也会在 API 中看到您应该永远使用此方法以及原因。同样,解决方案如上所述。

标签: java multithreading


【解决方案1】:

尝试遵循page 中提到的这种技术:

如何停止长时间等待(例如,等待输入)的线程?

这就是 Thread.interrupt 方法的用途。相同的“基于状态” 可以使用上面显示的信令机制,但状态会发生变化 (blinker = null, 在前面的例子中) 之后可以调用 Thread.interrupt,中断等待:

public void stop() {
    Thread moribund = waiter;
    waiter = null;
    moribund.interrupt();
}

要使这项技术发挥作用,任何能够捕捉到的方法都至关重要 中断异常,不准备立即处理 重申例外。我们说重新断言而不是重新抛出, 因为并不总是可以重新抛出异常。如果 捕获 InterruptedException 的方法未声明为抛出 这个(检查的)异常,那么它应该“重新中断自己” 以下咒语:

Thread.currentThread().interrupt();

这确保线程将重新引发 InterruptedException 为 尽快。

如果线程没有响应 Thread.interrupt 怎么办?

在某些情况下,您可以使用特定于应用程序的技巧。例如, 如果一个线程正在等待一个已知的套接字,您可以关闭该套接字以 导致线程立即返回。不幸的是,真的有 不是任何通用的技术。需要注意的是,在 等待线程没有响应的所有情况 Thread.interrupt,它也不会响应 Thread.stop。这样的 案例包括故意拒绝服务攻击和 I/O 操作 对于哪个 thread.stop 和 thread.interrupt 不能正常工作。

【讨论】: