首先我们要在了解线程池之前了解一下什么时对象池(资源池)
- 对象池也就是一般拿来存放一些资源的东西,客户端向池中申请请求,并返回资源池进行的指定操作,当使用完之后,会把资源放回资源池中而不是处理掉!
应用场景
- 当初始化对象的过程中代价大或者使用频率特别高的时候,我们能使用“池”的这种技术可以提升性能
线程池的一些类说明
- ExecutorService : 最底层线程池接口
- ScheduledExectorService : 定时任务与线程池功能结合类
- ThreadPoolExecutor : ExecutorService的实现类(重点常用)
- ScheduledThreadPoolExecutor :定时周期性的ExecutorService实现类
常用的线程池方法
- Executor中
中只有一个方法就时execute()执行提交Runnable,通常来启动线程
- ExecutorService中
- submit()可以提交一个可运行的线程Callable或者可提交Runnable返回该任务的结果
- shutdown() 关闭线程池,等待已启动的线程终止
- shutdownNow()关闭线程池,尝试停止所有的正在执行或暂停任务的线程后
- isTerminated() 在所有任务关闭后返回true
- ScheduledExecutorService
- schedule(Runnable , long, TimeUnit)
ExecutorService工作原理
ExecutorService创建过程
ExecutorService中的构造方法
参数 | 概要 |
---|---|
corePoolSize(必填) | 池中所保存的线程数,包括空闲线程。 |
maximumPoolSize(必填) | 池中允许的最大线程数。 |
keepAliveTime(必填) | 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。 |
unit - keepAliveTime(必填) | 时间单位。 |
workQueue(必填) | 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。 |
threadFactory | 执行程序创建新线程时使用的工厂 |
handler | 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。 |
步骤
private static int TASK_COUNT = 10;
public static void main(String[] args) {
/*1. 创建线程池对象 */
ThreadPoolExecutor pool = new ThreadPoolExecutor(5, 8, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5));
/*2. 提交任务*/
for (int i = 0; i < TASK_COUNT; i++) {
pool.execute(() -> {
System.out.println(Thread.currentThread().getName() + ":----->在执行任务");
});
}
/*3. 关闭连接池*/
pool.shutdown();
/* 或者 */
// pool.shutdownNow()
}