线程池:
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。
ThreadPoolExecutor构造方法:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数释义:
corePoolSize:一个int类型参数,用于指定核心线程数量
maximumPoolSize:一个int类型参数,用于指定最大线程数量
keepAliveTime:long类型参数,用于指定空闲时间
unit:用于指定空闲时间的单位
workQueue:阻塞队列
threadFactory:线程工厂
handler:拒绝策略
线程池的执行:
1.首先在每次接受任务时,线程池才会启动一个线程去执行(也就是线程池刚创建时是不会启动线程的)
2.启动线程时,会先启用核心线程,直到达到初始化时指定的核心线程数
3.达到核心线程数后,再接受的任务会被保存至阻塞队列中
4.当阻塞队列也存满后,多出的任务会继续启用线程执行,直到达到最大线程数
5.达到最大线程数后,再接受的任务就会执行拒绝策略
6.当超出核心线程的线程空闲时间达到了指定的空闲时间时,超出的线程会被销毁
拒绝策略:
1. 当客户端提交的任务被拒绝时,线程池所关联的RejectedExecutionHandlerrejectedExecution方法会被线程池调用。
2.ThreadPoolExecutor自身提供了几个现成的RejectedExecutionHandler接口的实现类。其中ThreadPoolExecutor.AbortPolicy是ThreadPoolExecutor使用的默认RejectedExecutionHandler。
3. 如果默认的RejectedExecutionHandler(它会直接抛出异常)无法满足要求,那么我们可以优先考虑ThreadPoolExecutor自身提供的其他RejectedExecutionHandler,其次才去考虑使用自身实现的
RejectedExecutionHandler接口常用实现类
AbortPolicy:(默认)
会直接抛出异常
构造方法:
public AbortPolicy()
DiscardPolicy:
丢弃当前被拒绝的任务(而不抛出任何异常)
构造方法:
public DiscardPolicy()
DiscardOldestPolicy:
将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务
构造方法:
public DiscardOldestPolicy()
CallerRunsPolicy:
在客户端线程中执行被拒绝的任务
构造方法:
public CallerRunsPolicy()