gpt4 book ai didi

java - 如何中断给定 Future 对象的线程?

转载 作者:行者123 更新时间:2023-12-01 13:41:46 24 4
gpt4 key购买 nike

我想启动一个线程,如果它在 5 秒内没有完成,则取消它:

private final class HelloWorker implements Callable<String> {
public String call() throws Exception {
while(true) {
if (Thread.isInterrupted()) {
return null;
}
}
return performExpensiveComputation();
}

private String performExpensiveComputation() {
// some blocking expensive computation that may or may not take a very long time
}
}

private ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
Future<String> future = executorService.submit(new HelloWorker());

try {
String s = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException e) {
future.cancel(true);

System.out.println("cancelled: " + future.isCancelled() + "done: " + future.isDone());

executorService.shutdown();

try {
System.out.println("try to terminate: " + executorService.awaitTermination(60, TimeUnit.SECONDS));
} catch (Exception ex) {
// ignore
}
}

然而,awaitTermination 看起来返回 false。有没有办法让我检查为什么 ExecutorService 不会终止?我可以找出哪些线程仍在运行吗?

最佳答案

没有安全的方法可以在不影响进程其余部分稳定性的情况下停止正在运行的线程。这就是为什么 Thread#stop 早已被弃用,以及为什么 Executor Services 仅使用软协作的 Thread#interrupt 机制。

您的线程必须主动检查是否已请求中断并在结束之前执行适当的清理。或者,线程将调用一些可中断的 JDK 方法,这些方法将抛出 InterruptedException,线程将正确遵守该异常并自行结束。

关于java - 如何中断给定 Future 对象的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20691933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com