ThreadPoolExecutor
corePoolSize:核心线程数量
maximumPoolSize:线程最大线程数
workQueue:阻塞队列,存储等待执行的任务,对线程运行过程产生重大影响
三个参数的关系:
如果线程数小于corePoolSize,直接创建新的线程处理任务,无论其他线程是否空闲。线程数量大于corePoolSize且小于maximumPoolSize时,只有当workQueue满的时候,才会创建新的线程,当workQueue没满时,任务进入workQueue队列。线程数大于maximumPoolSize,且workQueue满时会根据饱和策略rejectHandler做相应的处理。
allowCoreThreadTimeOut:是否允许核心线程超时退出,这里的时间就是keepAliveTime
1)如果该值为false,且线程数小于corePoolSize,核心线程不会超时退出;线程数大于corePoolSize,线程超时退出。
2)如果该值为true,无论线程多少,线程都会超时退出
keepAliveTime:线程没有任务执行时最多保持多久时间终止
unit:keepAliveTime的时间单位
threadFactory:线程工厂,用来创建线程
rejectHandler:当拒绝处理任务时的策略
1)直接抛出异常(默认策略)
2)调用者所在线程执行任务
3)丢弃队列中靠前(最久之前)的任务,并执行当前任务
4)直接丢弃任务
线程池的几种状态
running:可以处理新的任务和阻塞队列中的任务
shutdown:不接受新任务,可以处理阻塞队列中保存的任务(调用shutdown())
stop:不接受新任务,不处理阻塞队列中保存的任务(调用shutdownNow())
线程池的方法
execute():提交任务,交给线程池
submit():提交任务,能够返回执行结果 execute + Future
shutdown():闭关线程池,等待任务都执行完
shutdownNow():闭关线程池,不等待任务执行完
线程池类图
Executors.newCachedThreadPool
Executors.newFixedThreadPool
Executors.newScheduledThreadPool
Executors.newSingleThreadExecutor
上面的线程池都是通过ThreadPoolExecutor类中的构造函数创建的,只是传进的参数有所不同。