线程池参数
- corePoolSize:核心线程数,线程池中线程的数量
- maxinumPoolSize:最大线程数
- keepAliveTime/timeUnit:保持激活的超时时间,线程池中线程空闲不被释放的最大时间,配合timeUnit使用,为0表示永远不被释放
- workQueue:BlockQueue,工作线程任务的阻塞队列,用来存放等待执行的任务,默认实现:LinkedBlockedQueue
- threadFactory:线程池创建工厂,子类自定义实现接口“Thread newThread(Runnable)”通过工厂创建线程池具体的Thread线程。默认实现:DefaultThreadFactory
拒绝策略
handler(RejectedExecutionHandler) 当workqueue无法存放新加任务,或添加新任务后线程池停止工作,使用设置的拒绝策略拒绝新加任务的执行,可以用RejectedExecution来实现自己的拒绝策略。
- 默认拒绝策略:AbortPolicy,直接抛出异常
- CallerRunsPolicy:调用方执行策略,当前调用线程或添加任务的线程执行,这种方式当线程池无法执行时,使用调用方资源来执行任务
- DiscardPolicy:直接抛弃策略,忽略该任务,不执行不报错
- DiscardOldestPolicy:抛弃最早任务策略,将wordQueue的一个任务取出抛弃,将当前任务加入workQueue执行
线程池状态
- Running:初始状态,运行中
- Shutdown:关闭状态,shutdown()方法后变为该状态,不再接受新任务,仍处理已添加任务
- Stop:停止状态,调用shutdownNow()会从Running进入Stop状态,不接受新任务,并将执行中的线程中断
- Tidying:整理状态,此时队列中任务数量是0
- Terminated:终结状态,由Tidying状态调用terminated()进入此状态
常用线程池
- 固定线程数量的线程池:newFixedThreadPool创建,核心线程数和最大线程数一样,达到核心线程数之后,空闲线程不会超时被终止被释放,每添加一个任务,添加到工作任务队列,线程池创建一个线程,线程数等于核心线程数后,不会再创建线程。
- 单线程的线程池:newSingleThreadExecutor创建,核心和最大只有1,代理模式。
- 可缓存的线程池:newCachedThreadPool创建:核心线程数0,最大线程数Integer.MAX_VALUE,keepAliveTime 60s(空闲超过60s会被回收),使用了synchronousQueue同步队列,添加任务的同时,需要工作线程来取任务才可完成任务的添加和执行。
- 定时执行的线程池:newScheduledThreadPool创建,可指定核心线程数,最大线程数Integer.MAX_VALUE,核心线程数超过空闲时间不会被回收,使用来DelayedWorkQueue延时队列,通过延时队列来控制时间来执行。
线程执行
execute底层执行步骤
- 先检查线程池的运行状态和工作线程数量,如果工作线程的线程数少于核心线程数,则会创建一个新的线程来执行给定的任务,通过调用addWorker来执行任务。
- 如果超过了核心线程数量,把任务放到工作队列中,若工作队列没有满,则添加任务后,仍需要检查线程池的运行状态,如果不是Running状态,就把任务移除,使用拒绝策略来处理当前任务;否则将创建或唤醒工作线程来执行任务。
- 线程池不是running状态或者添加失败,使用拒绝策略来处理当前任务。