线程池
线程池的核心参数
ThreadPollExecutor中一共提供了7个参数,每个参数都是非常核心的属性,在线程池执行任务的时候,每个参数都有决定性的作用。
推荐自定义创建线程池,手动的new ThreadPollExecutor设置其他的核心属性。
其他核心参数
- int corePollSize 核心工作线程,当前任务执行结束后,不会被销毁
- maximumPollSize 最大工作线程,在当前的线程池中最多可以存在多少工作线程
- keepAliveTime 非核心工作线程在阻塞队列等待的时长
- TimeUnit unit 等待时长的单位
- BlockingQueue< Runnable > workQueue 任务没有核心线程可以处理时先扔到阻塞队列中。
- ThreadFactory threadFactory 构建线程时可以设置thread的一些信息。
- RejectedExecutionHandler handler 线程池无法处理投递的任务时,执行当前的拒绝策略。
JDK提供的拒绝策略
- AbortPolicy 在无法处理新任务的时候,直接抛出一个异常
- CallerRunPolicy 调用者自己的线程处理
- DiscardPolicy 直接丢弃任务
- DiscardOldesPolicy 丢弃队列中最早的任务,将当前任务尝试交给线程处理。
线程池的核心属性
核心属性就是ctl 基于ctl 拿到线程池的状态和工作线程的个数
32位的高三位就是状态,低29位表示线程的个数。
线程池的状态
- running
- shutdown
- stop
- tidying
- terminated
执行流程
JDK自带线程池(不推荐使用)
newFixedThreadPoll
固定数量线程池。
newSingleThreadExecutor
单个数量的线程池,线程池中只有一个线程在处理任务。
newCachedThreadPoll
没有核心线程,每次创建新的线程处理
newScheduleThreadPoll
定时任务线程池
原理是基于DelayQueue实现的延迟执行,周期性执行时任务完成后再次扔回阻塞队列中
newWorkStealingPoll
每个线程都有自己的阻塞队列,
自动拆分任务并行执行并合并结果。