【问题标题】:shutdownNow with executor service带有执行器服务的shutdownNow
【发布时间】:2012-12-17 18:41:59
【问题描述】:

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

【问题讨论】:

    标签: java multithreading executorservice


    【解决方案1】:

    您的假设是正确的,如果 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

    【讨论】:

    • 如果我的理解正确,我现在正在做的事情会留下挂起的线程,但最终未来会终止并自行清理?仅当 connect() 方法可以处理 InterruptedException 时,包含 future.cancel(true) 才会有益?
    • @Greg:您不再等待Future 的事实并不意味着它不再运行。当它完成时,它会像往常一样清理,但是没有人真正在等待结果。
    【解决方案2】:

    根据javadoc

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

    【讨论】:

    • 这么说,你是说当使用shutdownNow关闭服务时,任何产生的线程也应该结束?如果我使用shutdown,那么一切都会在Executor Service 关闭之前完成(包括生成)?
    • 不,shutdownNow() 不保证,shutdown() 保证该行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    相关资源
    最近更新 更多