线程池的目的
固定数量的线程来执行多数的任务,来避免反复创建和销毁线程所带来的的开销问题
线程池的启动
- corePoolSize
- maxPoolSize
- keepAliveTime
- workQueue
- threadFactory
- Handler
添加线程的规则
- 如果线程数小于corePooSize,即使其他线程处于空闲状态也会创建新的线程
- 如果线程数大于等于corePooSize小于maxPoolSize,则将任务放入队列
- 如果队列已满,并且线程数小于maxPoolSize,则创建一个新线程来运行任务
- 如果队列已满并且线程数大于或等于maxPoolSize,则拒绝该任务
综上:通过调节核心线程参数和最大线程数以及工作队列值的大小可以创建不同类型的线程池,比如固定线程池,
线程池的停止
- shutdown:不会立即停止,但不能再接受任务
- isShutdown:只要执行了shutdown方法就会返回true
- isTerminated:直到所有任务执行完毕返回true
- awaitTermination:检测阻塞的固定时间内能否全部执行完
- shutdownNow:立刻终止线程并返回任务集合
线程池的拒绝策略
AbortPolicy:throw RejectedExecutionException DiscardOldestPolicy:丢弃最旧未处理任务 DiscardPolicy: 默默地silently discards CallerRunsPolicy:谁提交谁执行
线程池的状态
- RUNNING:接受新任务并处理队列中的任务
- SHUTDOWN:不接受新任务但处理排队任务
- STOP:不接受新任务,也不处理队列中的任务,并停止正在进行的任务
- TIDING:所有任务都已经停止,workCount为0时,并将运行terminated()钩子方法
- TERMINATED:terminated方法运行完成