如何正确关闭线程池?

首先了解下ExecutorService接口中涉及线程池关闭的几个方法:

   /**
    *这个方法是一种安全关闭线程池的方法,调用这个方法后,
    *线程池会根据拒绝策略来拒绝新提交的任务,
    *然后线程池会把正在执行的任务,和在队列中等待任务都执行完后才会彻底关闭。
    */
    void shutdown();

    /**
     *这个方法就比较强势了,调用了这个方法后,线程池就会立即关闭,
     *从源码上分析的话,会发现调用了shutdownNow方法之后,
     *会给所有线程池中的线程发送interrupt中断信号,来尝试中断这些任务的执行,
     *这是一种优雅的中断线程的方式,不过也需要线程自身具有响应中断信号的能力,
     *同时可以发现这个方法有个Runnable集合返回,
     *这集合就是那些任务队列中正在等待被执行的任务集合,
     *返回之后,开发就可以根据这任务集合做一些补救的操作,比如先记录后面再重试
     */
    List<Runnable> shutdownNow();

    /**
     * 从方法名和返回值就可以判断出,这就是一个判断线程池是否关闭的方法,
     * 不过这里的时候关闭不是指真的关闭,而是指是否开始了关闭流程,
     * 比如调用了shutdown或者shutdownNow方法,
     * 这时候线程池可能还没真正的关闭,只是开始了关闭流程,
     * 比如拒绝新任务的提交,线程池里其实还是有任务在运行或者在等待被运行
     */
    boolean isShutdown();

    /**
     * 只有线程池里所有的任务都被执行完,调用这个方法才会返回true,
     * 表示线程池已关闭且内部的任务都已经执行完毕了
     */
    boolean isTerminated();

    /**
     * 看着返回值和方法名,就可以猜到又是一个判断线程池状态的方法,
     * 可以发现有两个参数timeout和unit构成了一个时间参数,
     * 调用了这个方法后,当前线程会等待一段指定的时间,
     * 如果在这个时间段内,线程池已经关闭且内部的任务都已经执行完毕了,
     * 那就会返回true,否则返回fasle
     */
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;

总结

了解了以上几种关闭线程池的有关方法(关闭的方法其实就shutdownshutdownNow两种),就可以根据实际的情况来选择合适的方法来判断和配合,从而关闭线程池。

发布了321 篇原创文章 · 获赞 345 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105427066