Java Executor 框架学习总结(Java Executor 框架深度解析与学习心得)
原创
一、Executor 框架概述
Java Executor 框架是 Java 并发编程的核心部分,提供了一套用于执行任务的接口和类。通过使用 Executor 框架,可以有效地管理线程的生命周期,节约程序的性能和并发性。本文将深入解析 Executor 框架的原理和用法,并分享学习心得。
二、Executor 框架核心组件
Executor 框架关键包括以下几个核心组件:
- Executor 接口
- ExecutorService 接口
- ThreadPoolExecutor 类
- Executors 工具类
三、Executor 接口
Executor 接口是 Executor 框架的基础,它定义了执行任务的单一方法 execute(Runnable command)。以下是一个简洁的 Executor 接口实现示例:
public interface Executor {
void execute(Runnable command);
}
public class SimpleExecutor implements Executor {
public void execute(Runnable command) {
new Thread(command).start();
}
}
四、ExecutorService 接口
ExecutorService 接口扩展了 Executor 接口,提供了更多彩的任务管理功能,如提交任务、获取任务执行最终、关闭线程池等。以下是一些常用的 ExecutorService 接口实现:
- ThreadPoolExecutor
- ScheduledThreadPoolExecutor
- SingleThreadExecutor
五、ThreadPoolExecutor 类
ThreadPoolExecutor 是 ExecutorService 接口的默认实现,它提供了线程池的创建和管理功能。以下是一个简洁的 ThreadPoolExecutor 使用示例:
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(new Runnable() {
public void run() {
System.out.println("执行任务");
}
});
executor.shutdown();
六、线程池参数解析
ThreadPoolExecutor 类的构造方法接收多个参数,以下是对这些参数的详细解释:
- corePoolSize:线程池的基本大小
- maximumPoolSize:线程池最大大小
- keepAliveTime:当线程数大于核心线程数时,这是多余空闲线程在终止前等待新任务的最长时间
- unit:keepAliveTime 参数的时间单位
- workQueue:任务队列,用于存放还未执行的任务
- threadFactory:线程工厂,用于创建新线程
- handler:拒绝策略,当任务太多无法处理时,采取的策略
七、线程池工作流程
当提交任务时,线程池的工作流程如下:
- 如果当前线程池中的线程数小于核心线程数,则创建新线程执行任务;
- 如果当前线程池中的线程数大于等于核心线程数,且任务队列未满,则将任务放入任务队列;
- 如果任务队列已满,且当前线程池中的线程数小于最大线程数,则创建新线程执行任务;
- 如果当前线程池中的线程数等于最大线程数,则采取拒绝策略处理任务。
八、线程池拒绝策略
当任务太多无法处理时,线程池会采取拒绝策略。以下是一些常见的拒绝策略:
- AbortPolicy:抛出 RejectedExecutionException 异常;
- CallerRunsPolicy:调用任务的 run 方法,不会抛出异常;
- DiscardPolicy:默默丢弃无法处理的任务,不抛出异常;
- DiscardOldestPolicy:丢弃队列中最旧的任务,然后执行新任务。
九、Executors 工具类
Java 提供了 Executors 工具类,用于迅速创建线程池。以下是一些常用的方法:
- newFixedThreadPool(int nThreads):创建固定大小的线程池;
- newCachedThreadPool():创建一个凭借需要创建新线程的线程池,但会重用以前构建的线程当它们可用时;
- newSingleThreadExecutor():创建一个单线程的 Executor,确保所有任务都在同一线程中按顺序执行;
- newScheduledThreadPool(int corePoolSize):创建一个可以安排在给定延迟后运行或定期执行的线程池。
十、学习心得
在学习 Java Executor 框架时,以下几点心得体会值得分享:
- 领会线程池的工作原理和参数设置,能够凭借实际需求创建合适的线程池;
- 熟悉各种拒绝策略,以便在任务过多时能够合理处理;
- 掌握线程池的关闭方法,确保程序终结时能够正确关闭线程池,释放资源;
- 了解 Executor 框架的其他组件,如 ScheduledThreadPoolExecutor、FutureTask 等,以扩展并发编程的知识。