基础介绍
含义:线程池就是一个容器,存放多个线程,只需将任务对象提交给线程池,线程池即可自动安排线程处理
了解:线程完成一项任务的时间 1.创建线程 2.使用线程 3.销毁线程
线程池优点
- 线程池技术优化了time1与time3的时间,可以将创建线程池放在线程启动时,销毁线程放在项目销毁时
- 有效控制项目中线程的个数
- 提高了线程的复用率,节约系统资源,提高系统响应速度与吞吐量
- 线程池能限制并发执行的线程数,控制系统中的并发度,通过配置线程池可有效避免过多线程的资源竞争
自带线程池
单个线程的线程池:Executors.newSingleThreadExecutor()
底层使用无界队列,有内存溢出风险
指定线程个数的线程池:Executors.newFixedThreadPool(num)底层使用无界队列,有内存溢出风险
带有缓存线程线程池:Executors.newCachedThreadPool()
最大线程数Integer.MAX_VALUE线程个数不可控
延迟提交的线程池:Executors.newSingleThreadScheduledExecutor()
线程个数不可控
七大参数
核心线程数、最大线程数、任务队列、拒绝策略、闲置时间、时间单位、线程工厂
任务顺序:1.核心线程 2.任务队列 3.普通线程 4.拒绝策略
任务队列
LinkedBlockingQueue
无界队列,最大线程数设置无效,当前线程池最大线程数为核心线程数,任务队列中一直添加可能会造成资源耗尽、内存溢出的问题
SynchronousQueue
同步队列/直接提交队列,该队列没有容量,每执行一个插入操作就会阻塞,需要再执行一个删除操作才会被唤醒,反之每一个删除操作也都要等待对应的插入操作。创建线程数大于最大线程数会进入拒绝策略抛出异常
ArrayBlockingQueue
有界队列,核心线程数满载后,任务进入有界队列,任务大于有界队列初始值后,创建普通线程,线程达到最大线程数量后,执行拒绝策略
PriorityBlockingQueue
优先任务队列 ,是一个特殊的无界队列,可自定义排序任务优先级先后执行
拒绝策略:默认报错
AbortPolicy
当有任务添加到线程池被拒绝时,会抛出RejectedExecutionException异常,线程池默认的拒绝策略。必须处理好抛出的异常,否则会打断当前的执行流程,影响后续的任务执行
DiscardPolicy
当有任务添加到线程池被拒绝时,直接丢弃,其他啥都没有
CallerRunsPolicy
当有任务添加到线程池被拒绝时,线程池会将被拒绝的任务添加到线程池正在运行的线程中去运行。 一般并发比较小,性能要求不高,不允许失败。但是,由于调用者自己运行任务,如果任务提交速度过快,可能导致程序阻塞,性能效率上必然的损失较大
DiscardOldestPolicy
当有任务添加到线程池被拒绝时,线程池会丢弃阻塞队列中末尾的任务(最老的任务),然后将被拒绝的任务添加到末尾。如果项目中有允许丢失任务的需求,可以使用