【发布时间】:2026-01-03 21:20:09
【问题描述】:
我一直在尝试杀死由于大量 IO 操作而挂起的线程。
我本可以尝试 thread.destroy 或 thread.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