关闭现在使用执行程序服务



我正在使用执行器服务进行连接任务,如下所示:

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() 方法生成的线程也会结束吗? 我知道杀死线程也会杀死任何子线程,但这是否遵循相同的逻辑?

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

你能做的是尝试取消未来并打断它。首先处理未来内部的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

根据 javadoc

尝试停止所有活动正在执行的任务,停止处理 等待任务,并返回正在等待的任务的列表 执行。除了尽最大努力尝试停止之外,没有任何保证 处理主动执行的任务。例如,典型 实现将通过 Thread.interrupt() 取消,因此任何任务 未能响应中断可能永远不会终止。

相关内容

  • 没有找到相关文章

最新更新