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数量的核心线程,准备接收任务
notion image
  • 1.先判断核心线程是否已满,未满分配线程
  • 2.任务队列是否已满,未满放入队列
  • 3.是否达到最大的线程数量,未达到创建新的线程
  • 4.通过对应的reject指定的拒绝策略进行处理
线程池的面试题:
  • 有一个线程池,core:5,max:50,queue:100,如果并发是200,那么线程池是怎么处理的?
  • 首先 200个中的前面5个会直接被核心线程处理,然后6个到105个会加入到阻塞队列中,然后106到155的请求在最大线程数中,那么会创建对应的线程来处理这些请求,之后剩下的45个请求会被直接放弃
notion image

3. 线程池的好处

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的管理