gpt4 book ai didi

java - shutdownNow 与执行程序服务

转载 作者:行者123 更新时间:2023-12-02 00:05:46 26 4
gpt4 key购买 nike

我正在使用ExecutorService连接任务如下:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<ApplicationConnection> future = (Future<ApplicationConnection>) executor.submit(new ConnectThread(crf, connoptions));
connection = future.get(300000, TimeUnit.SECONDS);
executor.shutdownNow();

call() 方法调用 .connect() 方法(专有 API)。这个 connect 方法会产生各种线程池等。我担心的是,如果将来超时并杀死执行器,将来可能已经通过调用 .connect() 方法产生的线程是否也会结束?我知道杀死一个线程也会杀死所有子线程,但这遵循相同的逻辑吗?

最佳答案

您的假设是正确的,如果 Future 超时,一些挂起的线程将保留。更糟糕的是,shutdownNow() 甚至不会关闭您的池线程(更不用说专有 API 线程)。它只是停止接受新工作。 ExecutorService 一旦所有正在运行的任务完成,线程池将终止所有线程。

你能做的就是尝试取消 future 并打断它。首先在 future 中处理 InterruptedException:

class ConnectThread implements Callbale<ApplicationConnection> {

public ApplicationConnection call() {
try {
return prioprietaryApi.connect();
} catch(InterruptedException e) {
prioprietaryApi.cleanUp();
throw e;
}
}

}

现在只需运行:

future.cancel(true);

但是,您的专有 API 可能无法处理 InterruptedException(它不会从 connect() 重新抛出它,而且您可能无权访问任何 cleanUp() 方法。

在这种情况下,就……忘记它吧。 Future 最终将自行终止并清理,忽略您不再等待它的事实。当然,这可能会导致各种可扩展性问题。

顺便说一句,如果您唯一想要实现的目标是限制给定方法运行的最大时间,请考虑 TimeLimiter来自 .

关于java - shutdownNow 与执行程序服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920119/

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