原文:https://www.jianshu.com/p/0e4a5e70bf0e
1.定义:缓存了一定线程数量的区域
2.作用:a.复用线程,减少性能开销
b.管理线程,统一分配、调优&监控线程,控制线程池的最大并发量
3.优点:a.降低因线程的创建&销毁带来的性能开销(重用缓存在线程池的线程)
b.提高线程的响应速度&执行效率(重用线程,不需创建即可执行线程 / 管理线程,优化线程的执行顺序)
c.提高对线程的管理度
4.传统的多线程方式(继承Thread类或实现Runnable接口):a.每次创建/销毁线程对象都会消耗资源且响应速度慢
b.线程缺少同一管理,容易出现阻塞现象
5.ThreadPool的核心参数:
上述6个参数的配置 决定了 线程池的功能,ThreadPoolExecutor
类 = 线程池的真正实现类
开发者可根据不同需求 配置核心参数,从而实现自定义线程池
6.ThreadPool运行时的工作逻辑:
7.ThreadPool的使用流程:
- 创建线程池:ThreadPoolExecutor executor = new TheadPoolExecutor(int corePoolSize, int maxmumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable workQueue>, ThreadFactory threadFactory);
- 向线程池提交任务:execute(),传入Runnable对象 ----> executor.execute(new Runnable(){})
- 关闭线程池:threadpool.shutdown()。关闭线程池的原理:遍历线程池所有线程,逐个线程调用interrupt()中断线程
8.常见的4类功能线程池
a.定长线程池(FixedThreadPool):
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
特点:只有核心线程 & 不会被回收、线程数量固定、任务队列无大小限制(超出的线程任务会在队列中等待)
应用场景:控制线程最大并发数
b.定时线程池(ScheduledThreadPool):
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
特点:核心线程数量固定、非核心线程数量无限制(闲置时马上回收)
应用场景:执行定时 / 周期性 任务
c.可缓存线程池(CachedThreadPool):
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
特点:只有非核心线程、线程数量不固定(可无限大)、灵活回收空闲线程(具备超时机制,全部回收时几乎不占系统资源)、新建线程(无线程可用时) / 任何线程任务到来都会立刻执行,不需要等待
应用场景:执行大量、耗时少的线程任务
d.单线程化线程池(SingleThreadExecutor):
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
特点:只有一个核心线程(保证所有任务按照指定顺序在一个线程中执行,不需要处理线程同步的问题)
应用场景:不适合并发但可能引起IO阻塞性及影响UI线程响应的操作,如数据库操作,文件操作等
f.四类功能线程池的对比: