1.线程池的作用
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:减少线程之间的替换
2.ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize, //线程核心数
int maximumPoolSize,//线程非核心树&&线程总数
long keepAliveTime,//空闲线程存活时间
TimeUnit unit,//时间单位
BlockingQueue<Runnable> workQueue,//队列
ThreadFactory threadFactory,//线程工厂
RejectedExecutionHandler handler//拒绝策略) {
this(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,
Executors.defaultThreadFactory(),defaultHandler);
}
3.Executors 工具类(阿里不推荐)
1.Executors.newCachedThreadPool();//没有核心线程,非核心线程无限大SynchronousQueue是一个不存储元素的队列,可以理解为队列永远是满的(可能导致处理器负荷太大,最终服务器崩溃)
2.Executors.newFixedThreadPool(10);//设置核心线程数,只有核心线程(他的队列是LinkedBlockingQueue,LinkedBlockingQueue是一个用链表实现的有界阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE。如果我们不设置LinkedBlockingQueue的容量的话,其默认容量Integer.MAX_VALUE,将会是可能导致内存溢出)
3.Executors.newSingleThreadExecutor();//只有一个核心线程(可能导致内存溢出)
4.自定义ThreadPoolExecutor
ThreadPoolExecutor threadPoolExecutor =new ThreadPoolExecutor(10,
20,
0L,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(10));
5.使用线程池
execute方法或submit
拒绝策略
CallerRunsPolicy - 当触发拒绝策略,只要线程池没有关闭的话,则使用调用线程直接运行任务。一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
AbortPolicy - 丢弃任务,并抛出拒绝执行 RejectedExecutionException 异常信息。线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行。
DiscardPolicy - 直接丢弃,其他啥都没有
DiscardOldestPolicy - 当触发拒绝策略,只要线程池没有关闭的话,丢弃阻塞队列 workQueue 中最老的一个任务,并将新任务加入