date
Jun 27, 2021
type
Page
status
Invisible
slug
ThreadPoolExecutor-1
summary
tags
category
password
Property
Sep 27, 2022 03:51 AM
icon
线程池的详解
1. 线程池的创建
- 通过Executors的静态方法
- 通过 new ThreadPoolExecutor方式创建
七大参数的作用
/** * 线程池详解 * @param args */ public static void main(String[] args) { // 第一种获取的方式 ExecutorService service = Executors.newFixedThreadPool(10); // 第二种方式: 直接new ThreadPoolExecutor()对象,并且手动的指定对应的参数 // corePoolSize:线程池的核心线程数量 线程池创建出来后就会 new Thread() 5个 // maximumPoolSize:最大的线程数量,线程池支持的最大的线程数 // keepAliveTime:存活时间,当线程数大于核心线程,空闲的线程的存活时间 8-5=3 // unit:存活时间的单位 // BlockingQueue<Runnable> workQueue:阻塞队列 当线程数超过了核心线程数据,那么新的请求到来的时候会加入到阻塞的队列中 // new LinkedBlockingQueue<>() 默认队列的长度是 Integer.MAX 那这个就太大了,所以我们需要指定队列的长度 // threadFactory:创建线程的工厂对象 // RejectedExecutionHandler handler:当线程数大于最大线程数的时候会执行的淘汰策略 ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5 , 100 , 10 , TimeUnit.SECONDS , new LinkedBlockingQueue<>(10000) , Executors.defaultThreadFactory() , new ThreadPoolExecutor.AbortPolicy() ); poolExecutor.execute(()->{ System.out.println("----->" + Thread.currentThread().getName()); }); }
2. 线程池的执行顺序
线程池创建,准备好core数量的核心线程,准备接收任务
- 1.先判断核心线程是否已满,未满分配线程
- 2.任务队列是否已满,未满放入队列
- 3.是否达到最大的线程数量,未达到创建新的线程
- 4.通过对应的reject指定的拒绝策略进行处理
线程池的面试题:
- 有一个线程池,core:5,max:50,queue:100,如果并发是200,那么线程池是怎么处理的?
- 首先 200个中的前面5个会直接被核心线程处理,然后6个到105个会加入到阻塞队列中,然后106到155的请求在最大线程数中,那么会创建对应的线程来处理这些请求,之后剩下的45个请求会被直接放弃
3. 线程池的好处
- 降低资源消耗
- 提高响应速度
- 提高线程的管理