为什么要用线程池
- 复用线程,节省创建和销毁线程的消耗
- 控制并发数量,并发量过多会导致大量的时间花费在线程切换上
- 对线程做统一的管理
线程池的继承结构
线程池的顶层接口是Executor接口,ThreadPoolExecutor是一个实现类。
继承结构图如下:
ThreadPoolExecutor构造方法:
- 5参构造:
int corePoolSize, //线程池中核心线程数的最大值
int maximumPoolSize, //线程总数(核心+非核心)的最大值
long keepAliveTime, //非核心线程的闲置超时销毁时间,如果设置了allowCoreThreadTimeOut(true)也会作用核心线程
TimeUnit unit, //上一个变量keepAliveTime的时间单位
BlockingQueue<Runnable> workQueue //阻塞队列,维护等待执行的Runnable任务对象队列 - 6参构造:
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory // - 6参构造:
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler - 7参构造:
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
核心线程:
线程池有两类线程,核心线程和非核心线程。核心线程会一直存在线程池中。即使这个线程什么也不干。非核心线程长时间闲置会被销毁。但是如果设置了allowCoreThreadTimeOut(true)核心线程也会超时销毁。
阻塞队列BlockingQueue<Runnable> workQueue:
常用的阻塞队列有如下几类:
- LinkedBlockingQueue:
- ArrayBlockingQueue:
- SynchronousQueue:
- DelayQueue:
创建线程工厂ThreadFactory threadFactory:
拒绝处理策略厂RejectedExecutionHandler handler
常用的4中拒绝处理策略:
- ThreadPoolExecutor.AbortPolicy:默认拒绝处理策略,丢弃任务并且
网友评论