【问题标题】:ExecutorService shutdownNow is not shutting down the JVMExecutorService shutdownNow 没有关闭 JVM
【发布时间】:2019-06-23 03:05:47
【问题描述】:

正在学习Java 1.5引入的ExecutorService

以下示例似乎违背了预期的行为:

public static void main(String[] args) throws InterruptedException,
ExecutionException,TimeoutException  {
    
    Callable<String> task = () -> {
        int counter = 0;
        while(true) {
            //infinite loop will never exit
            if(counter == 7) {
                break;
            }
        }
        return "abc";
    };
    
    ExecutorService service = Executors.newSingleThreadExecutor();          
    try {
    Future<String> future = service.submit(task);
    
        System.out.println("result = " + future.get(10000,TimeUnit.MILLISECONDS));
    }finally {
        System.out.println("<<<< finally >>>>");
        service.shutdownNow();
    }
    
    
    
}

查看此方法的 java 文档:

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

此方法不等待主动执行的任务终止。使用 awaitTermination 来做到这一点。

除了尽力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt 取消,因此任何未能响应中断的任务都可能永远不会终止。

理想情况下,我所期望的是,在指定超时后,我会得到一个超时异常,然后 ExecutorService 会强制关闭,但这并没有发生。

查看了 java 文档 - 它似乎确实表明无法保证它会关闭。

如果不能保证,那么应该避免吗?

【问题讨论】:

  • 没有必要避免它,只需了解限制并确保您执行的任务将正确响应中断。
  • 这不重要吗? "...so any task that fails to respond to interrupts may never terminate."您的可调用对象如何处理中断?

标签: java multithreading executorservice


【解决方案1】:

查看了 java 文档 - 它似乎表明无法保证它会关闭。

正确。

如果不能保证,那么应该避免吗?

没有。

您实际上应该做的是以避免或绕过限制的方式使用ExecutorService;例如

  • 实现任何可能长时间运行并且应该可以终止的任务,以便它们能够正确处理中断。如果您正确执行此操作,那么您的 ExecutorService 将终止。

  • 不要依赖ExecutorService 实际关闭。例如,您可以安排当应用程序需要关闭时,它会执行以下操作:

    1. 它调用shutdownNow()
    2. 它以适当的超时时间调用awaitTermination(...)
    3. 如果ExecutorService 没有终止,那么它会调用System.exit(...) 来终止应用程序。
  • 配置您的ExecutorService 以将工作线程创建为守护线程;见Turning an ExecutorService to daemon in Java

    守护线程不会阻止 JVM 退出。但请注意,您需要小心。如果所有非守护线程都已完成,JVM 将拔掉插头,而不会中断 ExecutorService 当前正在运行的任何任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2012-05-17
    相关资源
    最近更新 更多