ExecutorService

JVM 只有在所有(非守护)线程全部终止后才会退出。因此,如果无法正确地关闭 Executor,那么 JVM 将无法结束。

ExecutorService 扩展了 Executor 接口,添加了一些用于生命周期管理的方法(同时还有一些用于任务提交的便利方法)。

ExecutorService 中的生命周期管理方法
public interface ExecutorService extends Executor {

    void shutdown();

    List<Runnable> shutdownNow();

    boolean isShutdown();

    boolean isTerminated();

    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
    
    // ...... 其他用于任务提交的方法
}

ExecutorService 的生命周期有 3 种状态:运行关闭已终止

  • ExecutorService 在初始创建时处于运行状态

  • shutdown 方法将执行平缓的关闭过程:不再接受新的任务,同时等待已经提交的任务执行完成——包括那些还未开始执行的任务

  • shutdownNow 方法将执行粗暴的关闭过程:它将尝试取消所有运行中的任务,并且不再启动队列中尚未开始执行的任务

  • 在 ExecutorService 关闭后提交的任务将由“拒绝执行处理器(Rejected Execution Handler)”来处理。

  • 等所有任务都完成后,ExecutorService 将转入终止状态

    • 可以调用 awaitTermination 来等待 ExecutorService 到达终止状态,或者通过调用 isTerminated 来轮询 ExecutorService 是否已经终止。

    • 通常在调用 shutdown 之后会立即调用 awaitTermination,从而产生同步地关闭 ExecutorService 的效果。

最后更新于