线程池相关知识点

news/2024/9/19 0:53:38/ 标签: java, 开发语言, 线程池, 面试, 后端, spring boot

线程池是什么相信大家都是知道的,所以这里就不做解释了,直接看相关知识点吧。

初始化线程池方法

继承ThreadPool

实现Runnable

实现Callable 接口+ FutureTask (可以拿到返回结果,可以处理异常)

核心参数

  • corePoolSize:核心线程数。(理解为某个公司的长期员工)
  • maximumPoolSize:最大线程数。(理解为当前公司项目太多,需要招募短期员工,这个时候长期员工+短期员工数量就是最大线程数)
    • 这里最大线程数需要大于核心线程数,不然会报错:
  • keepAliveTime:空闲线程存活时间。
  • TimeUnit:时间单位。
  • BlockingQueue:线程池任务队列。
    • ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
    • LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
    • SynchronousQueue:一个不存储元素的阻塞队列,即直接提交给线程不保持它们。
    • PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
    • DelayQueue:一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素。
    • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。与SynchronousQueue类似,还含有非阻塞方法。
    • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
  • ThreadFactory:创建线程的工厂。
  • RejectedExecutionHandler:拒绝策略。

任务队列等于阻塞队列?

  1. 任务队列(Task Queue)

    • 任务队列是线程池中用于存放待执行任务的队列。
    • 当一个任务被提交到线程池时,如果线程池中的工作线程数已达到最大值,或者所有工作线程都在忙碌,那么这个任务就会被放入任务队列中等待后续执行。
    • 任务队列可以是无界的(如LinkedBlockingQueue),也可以是有界的(如ArrayBlockingQueue),具体取决于线程池的配置。
  2. 阻塞队列(Blocking Queue)

    • 阻塞队列是一种特殊的队列,它支持线程安全的入队(put)和出队(take)操作。
    • 当队列为空时,从队列中取元素的操作(如take)会阻塞,直到队列中有元素可用。
    • 当队列已满时,向队列中添加元素的操作(如put)会阻塞,直到队列中有空间可用。
    • 阻塞队列是实现任务队列的一种常见方式,但不是唯一的方式。例如,SynchronousQueue也是一种任务队列,但它不存储元素,而是直接将元素从一个生产者线程传递给消费者线程。

因此,任务队列是线程池中用于管理待执行任务的队列,而阻塞队列是一种支持线程安全操作的队列。阻塞队列可以作为实现任务队列的一种方式,但任务队列的概念更广泛,不一定局限于阻塞队列。在线程池的上下文中,任务队列通常是指用于存放待执行任务的队列,而这个队列可以是基于阻塞队列实现的。

拒绝策略

  1. AbortPolicy(默认策略):直接抛出RejectedExecutionException异常,阻止系统正常运行。
  2. CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度。
  3. DiscardPolicy:直接丢弃无法处理的任务,不抛出异常,也不执行任务。
  4. DiscardOldestPolicy:丢弃最旧的任务请求,然后尝试再次提交当前任务。

线程池的运行流程

  1. 线程池创建,准备好core 数量的核心线程,准备接受任务
  2. 新的任务进来,用core 准备好的空闲线程执行。 (1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的core 就会自己去阻塞队 列获取任务执行 (2) 、阻塞队列满了,就直接开新线程执行,最大只能开到max 指定的数量 (3) 、max 都执行好了。Max-core 数量空闲的线程会在keepAliveTime 指定的时间后自 动销毁。最终保持到core 大小 (4) 、如果线程数开到了max 的数量,还有新任务进来,就会使用reject 指定的拒绝策 略进行处理
  3. 所有的线程创建都是由指定的factory 创建的。

一个线程池core 7; max 20 ,queue:50,100 并发进来怎么分配的; 先有7 个能直接得到执行,接下来50 个进入队列排队,在多开13 个继续执行。现在70 个 被安排上了。剩下30 个默认拒绝策略。拒绝策略一般是抛弃,如果不想抛弃还要执行,可以使用同步的方式执行,或者丢弃最老的。

四种常见的线程池

  1. newCachedThreadPool创建一个可缓存线程池 ,如果线程池长度超过处理需要,可灵活回收空闲线程,若 无可回收,则新建线程。核心线程固定是0,所有都可回收
  2. newFixedThreadPool创建一个固定长线程池,可控制线程最大并发数, 超出的线程会在队列中等待。固定大小,核心 = 最大
  3. newScheduledThreadPool创建一个固定长线程池,支持定时及周期性任务执行。 定时任务线程池
  4. newSingleThreadExecutor创建一个 单线程化的线程池 ,它只会用唯一的工作线程来执行任务,保证所有任务 按照指定顺序(FIFO, LIFO, 优先级)执行。后台从队列里面获取任务 挨个执行

SpringBoot整合线程池

1、添加配置类,新建线程池

java">package cn.cloud.xmall.product.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;@Configuration
public class MyThreadConfig {@Beanpublic ThreadPoolExecutor threadPoolExecutor(){return new ThreadPoolExecutor(10,100,20,TimeUnit.SECONDS,new LinkedBlockingQueue<>(100000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());};}

2.想要在配置文件中手动的配置参数 新建一个配置属性类

java">package cn.cloud.xmall.product.config;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "mall.thread")
@Component  //加入容器
@Data
public class ThreadPollConfigProperties {private Integer coreSize;private Integer maxSize;private Integer keepAliveTime;
}

        可以在依赖种添加此依赖,在配置文件中就会有我们自己配置属性的提示

java"><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

3.配置文件配置属性

java">#线程池配置
mall:thread:core-size: 10max-size: 100keep-alive-time: 20

4.使用配置文件中的属性

@
EnableConfigurationProperties(ThreadPollConfigProperties.class),如果配置文件类没有添加@Component加入容器可以使用这种方式

java">package cn.cloud.xmall.product.config;import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;//@EnableConfigurationProperties(ThreadPollConfigProperties.class)
@Configuration
public class MyThreadConfig {@Beanpublic ThreadPoolExecutor threadPoolExecutor(ThreadPollConfigProperties pool){return new ThreadPoolExecutor(pool.getCoreSize(),pool.getMaxSize(),pool.getKeepAliveTime(),TimeUnit.SECONDS,new LinkedBlockingQueue<>(100000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());};}

5.注入线程池

@Autowired

private ThreadPoolExecutor executor;

6.异步编排

java">@Overridepublic SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {SkuItemVo skuItemVo = new SkuItemVo();//1.使用自己的线程池来新建异步任务CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {//1.查询基本信息 pms_sku_infoSkuInfoEntity info = getById(skuId);skuItemVo.setInfo(info);return info;}, executor);//2.根据一号任务来继续调用CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> {//3.获取当前spu的销售属性组合List<SkuItemSaleAttrVo> saleAttrVos = saleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());skuItemVo.setSaleAttr(saleAttrVos);}, executor);//3.根据一号任务来继续调用CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {//4.获取Spu的介绍 pms_spu_info_descSpuInfoDescEntity spuInfo = spuInfoDescService.getById(res.getSpuId());skuItemVo.setDesc(spuInfo);}, executor);//4.根据一号任务来继续调用CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {//5.获取spu的规格参数信息List<SpuItemAttrGroupVo> attrGroups = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());skuItemVo.setGroupAttrs(attrGroups);}, executor);//此任务不需要根据一号任务的返回调用,所以开一个新线程CompletableFuture<Void> imagesFuture = CompletableFuture.runAsync(() -> {//2.获取sku的图片信息 pms_sku_imagesList<SkuImagesEntity> images = imagesService.getImagesBySkuId(skuId);skuItemVo.setImages(images);}, executor);//等待所有任务都完成//TODO 可以选择有异常情况下的处理结果CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imagesFuture).get();return skuItemVo;}

该文档后续会继续更新,希望读者可以在评论区留言我可以根据具体的问题进行更新~


http://www.ppmy.cn/news/1519815.html

相关文章

将string类中能够实现的操作都封装在MyString类中

包括&#xff1a; 构造函数 析构函数 重载 &#xff0c;[]&#xff0c;,,,!,<,>,<,>,<<,>>; at&#xff1b; data&#xff1b; c_str; empty; length; capasityacity; clear; push_back; pop_back; append; 程序中我封装了大部分&#…

el-time-select 动态增加时间

<template><div><div v-for"(item, index) in timeSlots" :key"index"><el-time-select placeholder"起始时间" v-model"item.startTime" :picker-options"{start: 00:00,step: 00:15,end: 23:59,}"&g…

语音控制开关的语音识别ic芯片方案

语音控制开关是一种基于语音识别技术的设备&#xff0c;它通过内置的语音识别芯片&#xff0c;将用户的语音指令转化为电信号&#xff0c;从而实现对设备的控制。例如在智能家居设备上的应用&#xff0c;通常需要连接到家庭的Wi-Fi网络上&#xff0c;以便与智能手机或智能音箱等…

用实时计算释放当下企业大数据潜能

摘要&#xff1a;本文整理自阿里云高级产品解决方案架构师王启华&#xff08;敖北&#xff09;老师在 Flink Forward Asia 2023 中闭门会的分享。内容分为以下四个部分&#xff1a; 业务需求变化推动架构演进实时计算对于企业生产的意义从技术架构和技术场景来看发展和迭代客户…

使用 streamlink 把 m3u8 转为 mp4

问题描述&#xff0c; 背景&#xff0c; 来源&#xff1a; 下载 m3u8 ts —> 转为mp4, 按照以往的做法&#xff0c; 就是使用 python requests 一步一步地下载 m3u8, ts&#xff0c; 然后转换。 但是个人写的东西&#xff0c;毕竟问题比较多。 而且&#xff0c; 但是&…

2024 年的 Web3 游戏:演变、趋势和市场动态

Web3 游戏行业在经历了多年的快速发展和变革之后&#xff0c;正在2024年迎来全新的阶段。这个行业从最初的边玩边赚&#xff08;Play-to-Earn, P2E&#xff09;模式出发&#xff0c;如今正在向更为平衡的“边玩边赚”模式转型。这种转型不仅解决了早期 P2E 模式下存在的可持续性…

MyBatis-SQL-语句执行流程

已查询为例 首先我们可以看到&#xff0c;在查询的时候Mapper对象已经是被代理过后的&#xff1a; 所以会执行invoke方法&#xff0c;其底层实现就是JDK的动态代理&#xff1a; 如下图所示&#xff0c;如果MethodCache里面存在方法&#xff0c;则判断这个方法是否为default方…

python实现人工神经网络

要编写一个简单的人工神经网络&#xff08;ANN&#xff09;程序&#xff0c;可以从一个基本的前馈神经网络开始&#xff0c;该网络通常包括输入层、一个或多个隐藏层以及输出层。在这个例子中&#xff0c;将使用Python的NumPy库来处理数学运算&#xff0c;并使用Sigmoid函数作为…

【Python批量下载Landsat数据】

批量下载Landsat数据&#xff08;例如Landsat 8 OLI/TIRS&#xff09;可以通过多种方法实现&#xff0c;但通常涉及使用在线服务或API接口&#xff0c;如USGS EarthExplorer、Google Earth Engine&#xff08;GEE&#xff09;或者专门的库如landsatxplore&#xff08;一个Pytho…

配置了680M和780M集显的AMD CPU列表

AMD Radeon 680M 核显配置在以下型号的 CPU 上面&#xff1a; - Ryzen 9 6980HX&#xff1a;8 核心 16 线程&#xff0c;最高加速时钟频率可达 5.0GHz&#xff0c;配备 12CU RDNA 2 架构的 Radeon 680M 核显&#xff0c;频率为 2.4GHz 。 - Ryzen 9 6900HX&#xff1a;8 核心 …

MAC环境导出项目的目录结构

一、安装Homebrew包管理工具 /bin/bash -c "$(curl -fsSL https://gitee.com/ineo6/homebrew-install/raw/master/install.sh)" 官网网址&#xff1a;https://brew.idayer.com/ 二、用brew包管理工具安装tree brew install tree 三、打开终端&#xff0c;导出项目…

深入Redis:细谈持久化

Redis的数据是保存在内存中的&#xff0c;内存里面的数据是不持久的&#xff0c;要想做到持久化&#xff0c;必须要把在内存中的数据储存到硬盘上。 Redis速度非常快&#xff0c;数据只有在内存中才有这样的速度&#xff0c;但是为了持久&#xff0c;数据还是要想办法保存到硬…

Java Excel转PDF(免费)

目前市面上 Excel 转 PDF 的组件较多&#xff1a; 收费&#xff1a;aspose、GcExcel、spire开源&#xff1a;jacob、itextpdf 其中收费的组件封装得比较好&#xff0c;代码简洁&#xff0c;转换的效果也很好&#xff0c;但收费也高得离谱&#xff1a; 为了成本考虑&#xff…

videojs宫格视频选择播放

项目需要四宫格播放视频&#xff0c;而且还要实现点击视频加入播放。 首先&#xff0c;肯定要实现再一个页面上显示多个视频源并播放视频&#xff1a; <template><div><div v-for"(item,index) in videoList" :key"index" class"te…

在ElementUI项目中集成iconfont图标库

在前端项目开发中经常会遇到使用的组件库提供的ICON图标不够用的情况。最常见的解决方案无非就是把设计图的图标切图引入到项目中。还有就是使用svg图标&#xff0c;封装一个渲染组件在项目里面直接引入这个组件。 本文将介绍另一种方法&#xff0c;即集成iconfont图标库的图标…

9、LLaMA-Factory项目微调介绍

1、LLaMA Factory 介绍 LLaMA Factory是一个在GitHub上开源的项目&#xff0c;该项目给自身的定位是&#xff1a;提供一个易于使用的大语言模型&#xff08;LLM&#xff09;微调框架&#xff0c;支持LLaMA、Baichuan、Qwen、ChatGLM等架构的大模型。更细致的看&#xff0c;该项…

flutter 手写时钟

前言&#xff1a; 之前看过别人写的 js实现的 时钟表盘 挺有意思的&#xff0c;看着挺好 这边打算自己手动实现以下。顺便记录下实现过程&#xff1a;大致效果如下&#xff1a; 主要技术点&#xff1a; 表盘内样 倒角&#xff1a; 表盘下半部分是有一点倒角的感觉&#xff0c;…

尚品汇-MQ模块搭建测试、消息不丢失(重)(四十三)

目录&#xff1a; &#xff08;1&#xff09;消息不丢失 &#xff08;2&#xff09;消息确认 &#xff08;3&#xff09;消息确认业务封装 &#xff08;4&#xff09;封装发送端消息确认 &#xff08;5&#xff09;封装消息发送 &#xff08;6&#xff09;发送确认消息测试…

鸿蒙(API 12 Beta3版)【媒体资源使用指导】Media Library Kit媒体文件管理服务

应用可以通过photoAccessHelper的接口&#xff0c;对媒体资源&#xff08;图片、视频&#xff09;进行相关操作。 说明 在进行功能开发前&#xff0c;请开发者查阅[开发准备]&#xff0c;了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。文档中使用到p…

基于深度学习的游客满意度分析与评论分析【情感分析、主题分析】

需要本项目的可以私信博主 目录 1 绪论 1.1 选题背景及研究意义 1.1.1 选题背景 1.1.2 研究意义 1.2 研究内容与方法 1.2.1 研究内容 1.2.2 研究方法 1.3 创新与不足 1.3.1创新点 1.3.2研究局限性 2 文献综述 2.1 相关概念界定 2.1.1 大数据分析 2.1.2 游客满意度 2.2 国内外研…