代码之家  ›  专栏  ›  技术社区  ›  Frank Kong

Java中关闭ExecutorService的最佳方法

  •  4
  • Frank Kong  · 技术社区  · 6 年前

    这是我的原始代码:

    ExecutorService executorService = Executors.newFixedThreadPool(10);
    
    Future<String> f = executorService.submit(() -> {/*do something*/});
    
    executorService.shutdown();
    
    String result = f.get();
    System.out.println(result);
    

    f.get() 永远持续,程序将永远停止,永不退出。

    带着担心,下面是我的第二次尝试:

    ExecutorService executorService = Executors.newFixedThreadPool(10);
    
    Future<String> f = executorService.submit(() -> {/*do something*/});
    
    executorService.shutdown();
    
    if(!executorService.awaitTermination(10, TimeUnit.SECONDS)){
        executorService.shutdownNow();
    }
    
    String result = f.get();
    System.out.println(result);
    

    我的问题是如何设置强制关闭池中线程的时间,以便不必显式使用 awaitTermination 阻止程序。

    3 回复  |  直到 6 年前
        1
  •  5
  •   Malt    6 年前

    但是我担心如果写错了代码怎么办 出口。

    使用上面的代码,我可以确保线程在10秒后关闭

    shutdownNow() 实际上并不能保证执行器线程被关闭( documentation ):

    除了尽最大努力停止处理之外,没有任何保证 积极执行任务。例如,典型的实现将 中断可能永远不会终止。

    这个 ThreadPoolExecutor handle interrupts correctly .

    一旦任务正确停止,就可以根据应用程序和要关闭的任务估计关闭所需的时间。然后您可以正常关机:

    • shutdown()
    • 在合理的时间内等待有序关机 awaitShutdown()
    • 如果执行器仍在运行,请调用 并处理它返回的任何未完成任务。
        2
  •  2
  •   Dinesh    6 年前

    /** *阻塞,直到关闭后所有任务都已完成执行 *中断,以先发生者为准。 * *@param unit超时参数的时间单位 *{@code false}如果在终止前超时已过

        3
  •  2
  •   Shivang Agarwal    6 年前

    除了上述答案外,我还想补充以下几点。

    isDone() 在调用get()方法以验证任务是否在通过ExcuterService api的awaitTermination方法等待任务完成时完成。

    但是我建议你现在可以用

    给定计算完成的时间,然后检索 结果,如有。]

    未来的API。会的 .

    isShutdown() ExecuterService API的方法。