返回
线程池ThreadPoolExcutor生命周期解析
后端
2024-02-03 09:15:33
线程池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的生命周期是一个非常重要的概念。理解线程池的生命周期可以帮助您更好地管理线程池,避免出现问题。