线程池

一.为什么使用线程池?

  • 降低资源的消耗
  • 线程的复用
  • 控制最大的并发数
  • 管理线程

二.执行流程

  1. 在创建了线程池后,开始等待请求
  2. 当调用execute()方法添加一个请求任务时,线程池会做出如下判断:
  3. 如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务:
  4. 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列:
  5. 如果这个时候队列满了且正在运行的线程数量还小于maximumPoolSize,那么还是要创建非 核心线程立刻运行这个任务;
  6. 如果队列满了且正在运行的线程数量大于或等于1Size,那么线程池会启动饱和拒绝策略来执 行。
  7. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
  8. 当一个线程无事可做超过一定的时间(keepA1iveTime)时,线程会判断:
  9. 如果当前运行的线程数大于coreP佣1Size,那么这个线程就被停掉。
  10. 所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

这里放一个b站狂神说的视频链接,将线程池比喻成银行柜台进行讲解:https://www.bilibili.com/video/BV1B7411L7tE?p=23

线程池

三.3大方法,7大参数,4大拒绝策略

三大方法

  • Executors.newFixedThreadPool(10); //创建固定线程数的线程池
  • Executors.newSingleThreadExecutor(); //创建一个线程数的线程池
  • Executors.newCachedThreadPool();;//创建一个可扩展的线程池(可伸缩)
  • 这三种方式底层都是使用 new ThreadPoolExecutor()
  • 我们开发中使用哪一种?都不用,而是使用new ThreadPoolExecutor(7大参数),因为可自定义参数

七大参数

  • corePollSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:空闲的线程(除核心线程外的线程)保留的时间。(保存多级后销毁,核心线程不会销毁)
  • TimeUnit:空闲线程的保留时间单位。
  • BlockingQueue:阻塞队列,存储等待执行的任务。
  • ThreadFactory:线程工厂,用来创建线程,一般默认即可
  • RejectedExecutionHandler:设置拒绝策略

四大拒绝策略

  • new ThreadPoolExecutor.AbortPolicy();//默认,队列满了丢任务,抛出异常
  • new ThreadPoolExecutor.DiscardPolicy();//队列满了丢任务,不抛出异常【如果允许任务丢失这是最好的】
  • new ThreadPoolExecutor.DiscardOldestPolicy();//将最早进入队列的任务删除,之后再尝试加入队列
  • new ThreadPoolExecutor.CallerRunsPolicy();//如果添加到线程池失败,那么主线程会自己去执行该任务,回退。

四.解惑线程池的一些问题

线程池中阻塞队列的作用? 主要可以阻塞,不至于放弃线程。

  • 阻塞队列就是一个队列数据结构,当队列是空的,从队列中”获取”元素的操作将会被阻塞; 当队列是满的,从队列中添加元素的操作将会被阻塞。
  • 这是一般队列不能达到的效果,好处是我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,,因为这一切BlockingQueue 都给你一手包办了。

为什么要先添加到队列而不是先创建最大线程?

  • 因为创建新线程时,要维护一个全局锁,这个时候就会影响性能。
  • 把阻塞队列当作一个缓存区,避免频繁的创建和销毁线程(这里主要指非核心线程),这也是线程池的一个初衷。

线程池中线程复用的原理?

  • 线程池将线程和任务进行解耦,线程就是线程,任务就是任务。一个线程可以循环执行多个任务
  • 原理就是线程池对Thread进行封装,每次执行线程不是调用Thread.start(),而是让线程一直在做循环任务,不停的检查是否有任务需要执行,也就是调用run()执行任务。把所有的run() 都当作一个普通的方法进行。

寄语:先努力让自己发光,对的人才能迎着光而来。

Original: https://www.cnblogs.com/monkey-xuan/p/15864454.html
Author: 小猴子_X
Title: 线程池

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579550/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 注解@Slf4j

    如果不想每次都写private final Logger logger = LoggerFactory.getLogger(XXX.class); 可以用注解@Slf4j 一、在p…

    Java 2023年6月13日
    053
  • Linux 安装MySQL

    一、准备工作 https://dev.mysql.com/downloads/mysql/ 1.1 上传到指定目录,解压 tar -xvf mysql-8.0.19-linux-g…

    Java 2023年6月8日
    067
  • 使用idea+springboot+Mybatis搭建web项目

    使用idea+springboot+Mybatis搭建web项目 springboot的优势之一就是快速搭建项目,省去了自己导入jar包和配置xml的时间,使用非常方便。 1、创建…

    Java 2023年5月30日
    0123
  • Java理解mian方法

    public static void mian (Sring[ ] args) public :提供给JVM调用的 static:jvm在调用这个方法是,不需要创建对象 void:…

    Java 2023年6月6日
    080
  • 利用docker-compose一键部署

    利用docker-compose一键部署 利用docker-compose一键部署 前言 快速编写微服务 common-api nacos-server-provider naco…

    Java 2023年6月13日
    068
  • Redis的中并发问题的解决方案小结

    什么是Redis的并发竞争问题 Redis的并发竞争问题,主要是发生在并发写竞争。考虑到redis没有像db中的sql语句,update val = val + 10 where …

    Java 2023年6月9日
    067
  • Apache Druid数据查询套件详解计数、排名和分位数计算(送JSON-over-HTTP和SQL两种查询详解)

    5. 数据查询 欲看此文,必看如下两篇文章: Druid支持JSON-over-HTTP和SQL两种查询方式。除了标准的SQL操作外,Druid还支持大量的唯一性操作,利用Drui…

    Java 2023年6月15日
    072
  • springboot 测试类编译错误

    测试类需要和引导类处在同名的包下 posted @2022-05-16 13:34 HypoPine 阅读(17 ) 评论() 编辑 Original: https://www.c…

    Java 2023年6月15日
    086
  • MyBatis的注解实现复杂映射开发

    xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现,使用注解开发后,我们可以通过 @Results 注解, @Result 注解, @One …

    Java 2023年6月5日
    081
  • 面试官:你说说一条查询SQL的执行过程

    为了理解这个问题,先从Mysql的架构说起,对于Mysql来说,大致可以分为3层架构。 第一层作为客户端和服务端的连接,连接器负责处理和客户端的连接,还有一些权限认证之类。比如客户…

    Java 2023年6月13日
    068
  • 运用D3js开发关系图谱

    背景 公司要开发个关系图谱,一开始选型有两个一个echarts和d3js,但由于echarts拓展性并没有那么好,所以选择了d3js,但d3js说实话,对于我这种前端菜鸟来说,学习…

    Java 2023年6月7日
    059
  • mybatis:字符串相等的比较

    必须得用toString()进行转换,否则比较不成功。 <sql id="where_kflb"> <choose> <when …

    Java 2023年5月30日
    084
  • Spring基础只是—AOP的概念介绍

    Spring容器包含两个重要的特性:面向切面编程(AOP)和控制反转(IOC)。面向切面编程是面向对象(OOP)的一种补充,在面向对象编程的过程中编程针对的目标是一个个对象,而面向…

    Java 2023年6月8日
    082
  • YOLOX 0.1.0 环境配置

    YOLOX训练自己的数据集 一、准备数据集 配置好Pascal VOC格式的数据集,放入datasets文件夹下,或者跟项目名在同一级目录下也行。VOC数据集的格式为: VOCde…

    Java 2023年6月15日
    061
  • SpringBoot + websocket 实现模拟设备上下线

    package com .example .demo .websocket ; import org .slf4j .Logger ; import org .slf4j .Log…

    Java 2023年5月30日
    060
  • xxl-job踩坑记录——执行器,执行10分钟自动失败

    问题描述 上一篇Docker 部署xxl-job 报错:xxl-rpc remoting error(connect timed out), for url : xxxxxx &#…

    Java 2023年6月5日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球