一、为什么需要线程池?
在实际应用中,线程是很占用系统资源的,如果对线程管理不善,很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程。
好处:
(1)使用线程池可以重复利用已有的线程池继续执行任务,避免线程池在创建和销毁时造成消耗
(2)由于没有线程创建和销毁时的消耗,可以提高系统响应速度
(3)通过线程池可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小 等
二、线程池分类
ScheduledThreadPoolExecutor:可以定时执行任务
三、线程池原理
(1)有任务来了,先找核心线程处理
(2)核心线程都有任务的话,则全去队列等待
(3)队列满了则创建临时线程处理
(4)临时线程也全都有任务的话,则采取拒绝策略
ThreadPoolExecutor参数解释:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize:核心线程数;maximumPoolSize:最大线程数;keepAliveTime非核心线程空闲时存活时间;unit:时间单位 workQueue:阻塞队列;threadFactory:线程工厂(一般用默认值,不用传);handler:拒绝策略(也有默认值)
一般我们是自己根据业务创建线程池(可以指定参数,灵活运用),不用工厂去创建
ThreadPoolExecutor pool = new ThreadPoolExecutor(1,1,60,
TimeUnit.SECONDS,new ArrayBlockingQueue<>(5));