Java线程池
什么是线程池?
池化概念 (可重复利用、减少系统资源占用、加快使用连接的过程)

为什么使用线程池?
降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控
提供更强大的功能,延时定时线程池。可以帮助我们执行一些延时任务或定时任务。
jdk1.8线程池结构图

Executor (接口)
一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable command),
execute() (执行任务代码)
执行任务代码
public static void main(String[] args) throws IOException {
Executor e = new Executor() {
@Override
public void execute(Runnable r) {
System.out.println("execute");
r.run();
}
};
e.execute(()->{
System.out.println("线程1");
});
e.execute(()->{
System.out.println("线程2");
});
}
ExecutorService (接口)
是一个比Executor使用更广泛的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法
提供了管理Eecutor生命周期的方法,ExecutorService的生命周期包括了:运行 关闭和终止三种状态。
ExecutorService在初始化创建时处于运行状态。
shutdown方法等待提交的任务执行完成并不再接受新任务,在完成全部提交的任务后关闭
shutdownNow方法将强制终止所有运行中的任务并不再允许提交新任务
关闭线程池
ExecutorService提供了shutDown()和shutDownNow()两个函数来关闭线程池,底层还是通过逐个调用线程的interrupt()函数来实现中断线程从而关闭线程池的。
AbstractExecutorService
ExecutorService执行方法的默认实现
ForkJoinPool
将大任务分解成若干个小任务,当小任务均执行结束后,将任务做一个整合。
ThreadPoolExecutor(实现类)
线程池,可以通过调用Executors以下静态工厂方法来创建线程池并返回一个ExecutorService对象。
使用线程池主要使用的就是ThreadPoolExecutor类
它的核心参数有7个常用的有5个

| 参数名 | 作用 |
| corePoolSize | 核心线程池大小 |
| maximumPoolSize | 最大线程池大小 |
| keepAliveTime | 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间 |
| TimeUnit | keepAliveTime时间单位 |
| workQueue | 阻塞任务队列 |
| threadFactory | 新建线程工厂 |
| RejectedExecutionHandler | 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理 |
ScheduledExecutorService
一个可定时调度任务的接口
ScheduledThreadPoolExecutor
ScheduledExecutorService的实现,一个可定时调度任务的线程池
线程池执行流程

线程池应用场景
在之前做过的项目中短信验证的功能用到了线程池,点击发送验证码,我们为了快速响应用户,会把当前发送验证码的过程放入到线程池中执行,
- 创建一个线程池(一定要单例使用spring的@bean注解、注入使用@resource)
- 当某一个位置需要使用这个线程池的时候,直接注入使用即可
线程池只是处理任务,它不关心你的任务是什么
ThreadPoolExecutor中execute、submit方法的区别
execute没有返回值接受runnable
submit有返回值接受runnable和callable
线程池的关闭
shutdown() SHUTDOWN状态
shutdown函数会把线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
shutdownNow() STOP状态
shutdownNow方法会先将线程池状态修改为STOP,然后调用线程池里的所有线程的interrupt方法,并把工作队列中尚未来得及执行的任务清空到一个List中返回,getTask()方法返回null,从而线程退出 。但是ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。

浙公网安备 33010602011771号