推荐答案
// www.javascriptcn.com code example
// 线程池的工作流程示例代码
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
Runnable worker = new WorkerThread("" + i);
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {
// 等待所有任务完成
}
System.out.println("所有任务已完成");本题详细解读
线程池的工作流程
任务提交:
- 当调用
executor.execute(worker)时,任务会被提交到线程池中。 - 线程池会根据当前的线程数量和任务队列的状态来决定如何处理这个任务。
- 当调用
核心线程处理:
- 如果当前线程池中的线程数量小于核心线程数(corePoolSize),线程池会创建一个新的线程来处理任务。
- 如果当前线程池中的线程数量已经达到核心线程数,任务会被放入任务队列中等待执行。
任务队列:
- 任务队列是一个阻塞队列,用于存放等待执行的任务。
- 如果任务队列已满,线程池会根据最大线程数(maximumPoolSize)来决定是否创建新的线程来处理任务。
最大线程数:
- 如果任务队列已满且当前线程数小于最大线程数,线程池会创建新的线程来处理任务。
- 如果当前线程数已经达到最大线程数,线程池会根据拒绝策略来处理无法执行的任务。
线程回收:
- 当线程池中的线程空闲时间超过
keepAliveTime时,线程会被回收,直到线程池中的线程数减少到核心线程数。
- 当线程池中的线程空闲时间超过
线程池关闭:
- 调用
executor.shutdown()后,线程池会停止接受新的任务,并等待所有已提交的任务执行完毕。 - 调用
executor.shutdownNow()会尝试立即停止所有正在执行的任务,并返回未执行的任务列表。
- 调用
关键点
- 核心线程数(corePoolSize):线程池中始终保持的线程数量,即使它们处于空闲状态。
- 最大线程数(maximumPoolSize):线程池中允许的最大线程数量。
- 任务队列(workQueue):用于存放等待执行的任务的阻塞队列。
- 拒绝策略(RejectedExecutionHandler):当任务无法被线程池接受时,如何处理这些任务。
通过理解线程池的工作流程,可以更好地管理和优化多线程任务的执行。