线程池总结

Posted 浅殇忆流年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池总结相关的知识,希望对你有一定的参考价值。

学习目标:

关键词:线程池、线程池执行流程、常见的几种线程池。


学习内容:

学习视频来源:https://www.bilibili.com/video/BV1dt4y1i7Gt?share_source=copy_web

“池化”思想:

  • 线程池
  • 字符串常量池
  • 数据库连接池
    在这里插入图片描述

线程池的执行流程:
在这里插入图片描述
线程池的参数介绍:
ThreadPoolExecutor的7个参数:
在这里插入图片描述

  • corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时,(除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。)
  • maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
  • keepAliveTime(线程存活保持时间)当线程池中线程数大于核心线程数时,线程的空闲时间如果超过线程存活时间,那么这个线程就会被销毁,直到线程池中的线程数小于等于核心线程数。
  • workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。
  • threadFactory(线程工厂):用于创建新线程。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号)。
  • handler(线程饱和策略):当线程池和队列都满了,再加入线程会执行此策略。
public class Test {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(3, 5, 1L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 6; i++) {
            threadPoolExecutor.execute(()->{
                System.out.println(Thread.currentThread().getName() + "===>办理业务");
            });
        }
        threadPoolExecutor.shutdown();
    }
}

https://www.edrawsoft.cn/viewer/public/s/max/22936223993923

常见的几种线程池:

ExecutorService fixedPool = Executors.newFixedThreadPool(5);
ExecutorService cachedPool = Executors.newCachedThreadPool();
ExecutorService singlePool = Executors.newSingleThreadExecutor();
ExecutorService scheduledPool = Executors.newScheduledThreadPool(5);

以上是关于线程池总结的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程-线程池的使用与线程总结(狂神说含代码)

线程池与并行度

Java——线程池

Motan在服务provider端用于处理request的线程池

Java线程池详解

Java线程池详解