什么是线程池呢,先举一个情景:
一个火锅店开业了,早上人比较少,大家进店后不需要预约,直接付款在店里的桌子上吃饭,慢慢的人多了,店里的桌子不够用了,没座位的人可以先预约,等别人吃完后再吃,但是预约的人越来越多,店长就搬了一些桌子放到外面,让大家可以在外面就餐,如果人还是多,就不接客了,当人变少的时候就把外面的桌子收回来。
店长通过在人多的时候放临时桌子缓解,人少的时候再收回,节约了外面桌子的维护成本
这就是线程池的工作原理。
JDK中有包装的线程池:
// 1. 用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,如果线程空闲60秒将收回并移出缓存
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 2. 创建一个操作无界队列且固定大小线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
// 3. 创建一个操作无界队列且只有一个工作线程的线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
// 4. 创建一个单线程执行器,可以在给定时间后执行或定期执行。
ScheduledExecutorService singleThreadScheduledExecutor = Executors.newSingleThreadScheduledExecutor();
// 5. 创建一个指定大小的线程池,可以在给定时间后执行或定期执行。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
// 6. 创建一个指定大小(不传入参数,为当前机器CPU核心数)的线程池,并行地处理任务,不保证处理顺序
Executors.newWorkStealingPool();
不可自定义,用的较少,下面介绍可以自定义的系统自带的线程池
1.线程池的参数
corePoolSize:核心线程数量
maximumPoolSize:线程吃的最大线程数,临时线程数=最大线程数-核心线程数
keepAliveTime:临时线程存活的时间
unit:临时线程存活的时间单位,与keepAliveTime搭配使用
workQueue:组织保存任务的队列
threadFactory:创建线程的工厂
handler:拒绝策略
AbortPolicy:直接拒绝(会报异常)
CallerRunsPolicy:返回给调用者
DiscardOldestPolicy:放弃目前最早等待的任务
DiscardPolicy:放弃新提交的任务