返回

线程池ThreadPoolExcutor生命周期解析

后端

线程池ThreadPoolExecutor生命周期

线程池ThreadPoolExecutor的生命周期可以用以下转换图来表示:

                         +--------------+
                         |  RUNNING    |
                         +--------------+
                               |
                               |
        +---------------+  shutdown()  +---------------+
        |  SHUTDOWN     |----------->| TERMINATING  |
        +---------------+             +---------------+
                               |
                               |
        +--------------+ shutdownNow() +--------------+
        |  STOPPED     |------------->| TIDYING     |
        +--------------+             +--------------+
                               |
                               |
        +--------------+             +--------------+
        |  TERMINATED  |------------->|  DYING     |
        +--------------+             +--------------+
                               |
                               |
                              +--------------+
                              |   DEAD      |
                              +--------------+
  • RUNNING: 这是线程池的初始状态。此时,线程池可以接受新任务并执行它们。
  • SHUTDOWN: 当调用shutdown()方法时,线程池将进入SHUTDOWN状态。此时,线程池不再接受新任务,但会继续执行已经提交的任务。
  • TERMINATING: 当所有提交的任务都执行完毕后,线程池将进入TERMINATING状态。此时,线程池会等待所有正在运行的任务执行完毕,然后终止所有线程。
  • STOPPED: 当所有线程都终止后,线程池将进入STOPPED状态。此时,线程池无法再执行任何任务。
  • TIDYING: 当调用shutdownNow()方法时,线程池将进入TIDYING状态。此时,线程池会立即终止所有线程,并尝试取消所有尚未执行的任务。
  • TERMINATED: 当所有线程都终止后,线程池将进入TERMINATED状态。此时,线程池无法再执行任何任务。
  • DYING: 当shutdownNow()方法被调用时,线程池会进入DYING状态。此时,线程池会尝试取消所有尚未执行的任务,并等待所有正在运行的任务执行完毕。
  • DEAD: 当所有任务都执行完毕后,线程池将进入DEAD状态。此时,线程池无法再执行任何任务。

shutdown()方法源码分析

public void shutdown() {
    checkShutdownAccess();
    synchronized (this) {
        running = false;
        if (workers > 0) {
            interruptIdleWorkers(false);
        }
    }
}
  • checkShutdownAccess()方法 :该方法用于检查当前线程是否有权限调用shutdown()方法。如果当前线程没有权限,则会抛出IllegalStateException异常。
  • running字段 :该字段用于标识线程池是否正在运行。当running字段被设置为false时,线程池将停止接受新任务。
  • workers字段 :该字段表示当前线程池中正在运行的线程数。
  • interruptIdleWorkers(false)方法 :该方法用于中断所有空闲的线程。

ThreadPoolExecutor生命周期管理技巧

  • 使用shutdown()方法来关闭线程池 :shutdown()方法是一种优雅地关闭线程池的方式。它会等待所有提交的任务都执行完毕后,再终止所有线程。
  • 使用shutdownNow()方法来立即关闭线程池 :shutdownNow()方法会立即终止所有线程,并尝试取消所有尚未执行的任务。这可能会导致任务执行失败或数据丢失。
  • 使用checkShutdownAccess()方法来检查当前线程是否有权限调用shutdown()方法 :checkShutdownAccess()方法可以防止其他线程在您关闭线程池时执行新任务。
  • 使用running字段来标识线程池是否正在运行 :running字段可以用于检查线程池是否正在运行。
  • 使用workers字段来表示当前线程池中正在运行的线程数 :workers字段可以用于获取当前线程池中正在运行的线程数。
  • 使用interruptIdleWorkers(false)方法来中断所有空闲的线程 :interruptIdleWorkers(false)方法可以用于中断所有空闲的线程。

结语

线程池ThreadPoolExecutor的生命周期是一个非常重要的概念。理解线程池的生命周期可以帮助您更好地管理线程池,避免出现问题。