一:线程池入门
1.1:线程池体系结构
线程池的体系结构:
java.util.concurrent.Executor 负责线程的使用和调度的根接口
|--ExecutorService 子接口: 线程池的主要接口
|--ThreadPoolExecutor 线程池的实现类
|--ScheduledExceutorService 子接口: 负责线程的调度
|--ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor,实现了ScheduledExecutorService
工具类 : Executors 是工具类,快捷的创建线程池的方法
1.2:线程实现类参数
// 创建线程池
ExecutorService es = new ThreadPoolExecutor();
// 执行任务
es.execute (任务)
public ThreadPoolExecutor(int corePoolSize, // 核心工作线程的数量
int maximumPoolSize, // 最大的工作线程数量。当任务队列满了的时候,会创建(最大线程-核心线程数量)临时线程来帮我们处理任务
long keepAliveTime, // 保持时间。 临时线程执行完任务后,会主动去任务队列里获取任务 如果经过 keepAliveTime 没有获取到,临时线程销毁。核心线程默认不超时。
TimeUnit unit, // 时间的单位
BlockingQueue<Runnable> workQueue, //存放任务 阻塞队列 (先入先出 线程安全 存取的阻塞方法)
// ArrayBlockingQueue 基于数组的有界的阻塞队列
// LinkedBlockingQueue 基于数组的无界的阻塞队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler){}
// 拒绝策略 / 饱和策略
AbortPolicy (默认) 丢弃任务, 并且抛出异常
CallerRunsPolicy 不抛弃任务,让调用线程池的线程帮忙执行任务
DiscardPolicy 丢弃任务,不抛出异常
DiscardOldestPolicy 丢弃任务,不抛出异常,抛弃任务队列最早加入的任务
1.3:线程池执行流程
流程1 判断核心线程数
流程2 判断任务能否加入到任务队列
流程3 判断最大线程数量
流程4 根据线程池的拒绝策略处理任务