【多线程】 —— 线程池

news2024/9/21 22:37:55

文章目录

  • 1、什么是线程池,线程池有哪些(创建)
    • (1) newCachedThreadPool
    • (2) newFixedThreadPool
    • (3) newSingleThreadExecutor
    • (4) newScheduleThreadPool
  • 2、为什么要使用线程池?
  • 3、线程池底层工作原理
  • 4、ThreadPoolExecutor 对象有哪些参数? 怎么设定核心线程数和最大线程数? 拒绝策略有哪些?
      • 1) corePoolSize:核心线程数,
      • (2) maximumPoolSize:最大线程数
      • (3) keepAliveTime:存活时间,
      • (4) unit:keepAliveTime 的单位。
      • (5) workQueue:任务队列
      • (6) threadFactory:线程工厂,
      • (7) RejectedExecutionHandler:拒绝策略
    • 线程池大小设置
    • 拒绝策略
  • 5、常见的线程安全的并发容器有哪些?

1、什么是线程池,线程池有哪些(创建)

线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用 new 线程而是
直接去池中拿线程即可,节省了开辟子线程的时间,提高的代码执行效率。

在JDK的java.uti.concurrent./executors类中提供了生成多种不同线程池的静态方法

ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(4);
ScheduledExecutorService newScheduledThreadPool =
Executors.newScheduledThreadPool(4);
ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

然后调用他们的 execute 方法即可。
这 4 种线程池底层 全部是 ThreadPoolExecutor 对象的实现,阿里规范手册中规定线
程池采用 ThreadPoolExecutor 自定义的,实际开发也是。

(1) newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若
无可回收,则新建线程。这种类型的线程池特点是:
工作线程的创建数量几乎没有限制(其实也有限制的,数目为 Interger.
MAX_VALUE), 这样可灵活的往线程池中添加线程。
如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为
1 分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程
池重新创建一个工作线程。
在使用 CachedThreadPool 时,一定要注意控制任务的数量,否则,由于大量线程
同时运行,很有会造成系统瘫痪。

(2) newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如
果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。
FixedThreadPool 是一个典型且优秀的线程池,它具有线程池提高程序效率和节省
创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任
务时,它不会释放工作线程,还会占用一定的系统资源。

(3) newSingleThreadExecutor

创建一个单线程化的 Executor,即只创建唯一的工作者线程来执行任务,它只会
用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)
执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最
大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是
活动的。

(4) newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行。例如延迟 3 秒
执行。

2、为什么要使用线程池?

(1) 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然
后在线程创建后启动这些任务,如果线程数量超过了最 大数量,超出数量的线程排队
等候,等其它线程执行完毕,再从队列中取出任务来执行。

(2) 主要特点:线程复用;控制最大并发数:管理线程。
第一: 降低资源消耗。通过重复利用己创建的线程降低线程创建和销毁造成的消
耗。
第二: 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执
行。
第三: 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系
统资源,还会降低系统的稳定性,使用线程池可以进 行统一的分配,调优和监控

3、线程池底层工作原理

在这里插入图片描述

  • (1) 第一步:线程池刚创建的时候,里面没有任何线程,等到有任务过来的时候才会
    创建线程。当然也可以调用 prestartAllCoreThreads() 或
    者 prestartCoreThread() 方法预创建 corePoolSize 个线程
  • (2) 第二步:调用 execute()提交一个任务时,如果当前的工作线程数
    <corePoolSize,直接创建新的线程执行这个任务
  • (3) 第三步:如果当时工作线程数量>=corePoolSize,会将任务放入任务队列中缓存
  • (4) 第四步:如果队列已满,并且线程池中工作线程的数量<maximumPoolSize,还是
    会创建线程执行这个任务
  • (5) 第五步:如果队列已满,并且线程池中的线程已达到 maximumPoolSize,这个时
    候会执行拒绝策略,JAVA 线程池默认的策略是 AbortPolicy,即抛出
    RejectedExecutionException 异常

4、ThreadPoolExecutor 对象有哪些参数? 怎么设定核心线程数和最大线程数? 拒绝策略有哪些?

首先我们都知道有7个参数:

1) corePoolSize:核心线程数,

在 ThreadPoolExecutor 中有一个与它相关的配置:allowCoreThreadTimeOut(默
认为 false),当 allowCoreThreadTimeOut 为 false 时,核心线程会一直存活,
哪怕是一直空闲着。而当 allowCoreThreadTimeOut 为 true 时核心线程空闲时间
超过 keepAliveTime 时会被回收。

(2) maximumPoolSize:最大线程数

线程池能容纳的最大线程数,当线程池中的线程达到最大时,此时添加任务将会采
用拒绝策略,默认的拒绝策略是抛出一个运行时错误
(RejectedExecutionException)。值得一提的是,当初始化时用的工作队列为
LinkedBlockingDeque 时,这个值将无效。

(3) keepAliveTime:存活时间,

当非核心空闲超过这个时间将被回收,同时空闲核心线程是否回收受
allowCoreThreadTimeOut 影响。

(4) unit:keepAliveTime 的单位。

(5) workQueue:任务队列

常用有三种队列,即 SynchronousQueue,LinkedBlockingDeque(无界队
列),ArrayBlockingQueue(有界队列)。

(6) threadFactory:线程工厂,

ThreadFactory 是一个接口,用来创建 worker。通过线程工厂可以对线程的一些属
性进行定制。默认直接新建线程。

(7) RejectedExecutionHandler:拒绝策略

也是一个接口,只有一个方法,当线程池中的资源已经全部使用,添加新线程被拒
绝时,会调用 RejectedExecutionHandler 的 rejectedExecution 法。默认是抛出一
个运行时异常。

线程池大小设置

线程池大小设置:

  1. 需要分析线程池执行的任务的特性: CPU 密集型还是 IO 密集型
  2. 每个任务执行的平均时长大概是多少,这个任务的执行时长可能还跟任务处理
    逻辑是否涉及到网络传输以及底层系统资源依赖有关系

如果是 CPU 密集型,主要是执行计算任务,响应时间很快,cpu 一直在运行,这
种任务 cpu 的利用率很高,那么线程数的配置应该根据 CPU 核心数来决定,CPU
核心数=最大同时执行线程数,加入 CPU 核心数为 4,那么服务器最多能同时执行
4 个线程。过多的线程会导致上下文切换反而使得效率降低。那线程池的最大线程
数可以配置为 cpu 核心数+1 ;

如果是 IO 密集型,主要是进行 IO 操作,执行 IO 操
作的时间较长,这是 cpu 出于空闲状态,导致 cpu 的利用率不高,这种情况下可
以增加线程池的大小。这种情况下可以结合线程的等待时长来做判断,等待时间越
高,那么线程数也相对越多。一般可以配置 cpu 核心数的 2 倍。

一个公式:线程池设定最佳线程数目 = ((线程池设定的线程等待时间+线程
CPU 时间)/
线程 CPU 时间 )* CPU 数目
这个公式的线程 cpu 时间是预估的程序单个线程在 cpu 上运行的时间(通常使用
loadrunner 测试大量运行次数求出平均值)

拒绝策略

  1. AbortPolicy:直接抛出异常,默认策略;
  2. CallerRunsPolicy:用调用者所在的线程来执行任务;
  3. DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务;
  4. DiscardPolicy:直接丢弃任务;当然也可以根据应用场景实现
    RejectedExecutionHandler 接口,自定义饱和策略,如记录日志或持久化存储不能处
    理的任务

5、常见的线程安全的并发容器有哪些?

CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap
CopyOnWriteArrayList、CopyOnWriteArraySet 采用写时复制实现线程安全
ConcurrentHashMap 采用分段锁的方式实现线程安全


还可参考以下文章:
1、Java线程池7个参数详解

2、线程池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/902147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【剖析STL】vector

vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是…

激活函数总结(十四):激活函数补充(Gaussian 、GCU、ASU)

激活函数总结&#xff08;十四&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Gaussian 激活函数2.2 Growing Cosine Unit (GCU)激活函数2.3 Amplifying Sine Unit (ASU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、R…

AI绘画之三_StableDiffusion_界面操作

1 介绍 首先&#xff0c;介绍界面中的重要元素&#xff0c;如图所示&#xff1a; 基础模型&#xff1a;基础模型是最重要的设置项文生图&#xff1a;选项卡列出了各大功能&#xff0c;文生图指通过文字生成图片图生图&#xff1a;图生图指通过图片和文字生成图片修复照片&am…

LLM大模型生产部署的12个最佳实践

大型语言模型 (LLM) 彻底改变了自然语言处理和理解领域&#xff0c;实现了跨各个领域的广泛人工智能应用。 然而&#xff0c;在生产中部署 LLM 应用程序也面临着一系列挑战。 从解决自然语言的歧义到管理成本和延迟&#xff0c;有几个因素需要仔细考虑。 推荐&#xff1a;用 NS…

腾讯云轻量应用服务器配置(详细版)

腾讯云轻量应用服务器CPU内存带宽配置高&#xff0c;成本很低&#xff0c;腾讯云百科来详细说下腾讯云服务器从购买、配置到网站上线全流程&#xff0c;包括轻量服务器配置选择、应用镜像选择、重置密码、防火墙开放端口教程等详细教程&#xff1a; 目录 一&#xff1a;注册腾…

jsp 网络社区便利店系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 网络社区便利店系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.…

解决Kibana(OpenSearch)某些字段无法搜索问题

背景 最近在OpenSearch查看线上日志的时候&#xff0c;发现某个索引下有些字段无法直接在界面上筛选&#xff0c;搜索到也不高亮&#xff0c;非常的不方便&#xff0c;就像下面这样 字段左侧两个筛选按钮禁用了无法点击&#xff0c;提示 Unindexed fields can not be searched…

Ubuntu系统下搭建QtCreator开发环境详细过程(Qt简介;Linux下安装QtCreator)

关于Qt的相关介绍&#xff0c;可以参考QT从入门到实战x篇&#xff0c;Qt 5.9 C开发指南&#xff0c;对于重复部分&#xff0c;本栏目不做详细介绍。关于Linux的基础&#xff0c;本人将重新整理一个栏目&#xff0c;就叫Linux基础吧&#xff0c;有需要的可以后期关注下。 文章目…

Apache ShenYu 学习笔记一

1、简介 这是一个异步的&#xff0c;高性能的&#xff0c;跨语言的&#xff0c;响应式的 API 网关。 官网文档&#xff1a;Apache ShenYu 介绍 | Apache ShenYu仓库地址&#xff1a;GitHub - apache/shenyu: Apache ShenYu is a Java native API Gateway for service proxy, pr…

和韦老师相约RISC-V交流会​

关注、星标公众号&#xff0c;直达精彩内容 来源&#xff1a;技术让梦想更伟大作者&#xff1a;李肖遥 和韦老师相约RISC-V交流会&#xff0c;最近公司项目有在用xuantie C906的core&#xff0c;一直在使用和学习riscv&#xff0c;正巧有个xuantie主题的训练会&#xff0c;想来…

Component name “Home“ should always be multi-word

错误 解决方案 在根目录找到eslintrc.js文件&#xff0c;配置关闭名称的校验&#xff0c;在该文件中&#xff0c;找到rules进行配置&#xff0c;如下代码&#xff1a; rules: {vue/multi-word-component-names: off, // 关闭名称校验}

查询投稿会议的好用网址

会议伴侣 https://www.myhuiban.com/ 艾思科蓝 https://www.ais.cn/

什么是Eureka?以及Eureka注册服务的搭建

导包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…

MathType7MAC中文版数学公式编辑器下载安装教程

如今许多之前需要手写的内容都可以在计算机中完成了。以前我们可以通过word输入一些简单的数学公式&#xff0c;但现在通过数学公式编辑器便可以完成几乎所有数学公式的写作。许多简单的数学公式&#xff0c;我们可以使用输入法一个个找到特殊符号并输入&#xff0c;但是对于高…

PHP命名空间结合自动加载spl_autoload_register使用

1、控制器命名空间controller/index.php <?php namespace app\admin\controller; class index {public function test(){echo "运行\admin\controller\index-> test()";} }2、模型命名空间model/index.php <?php namespace app\admin\model; class tes…

C语言入门_Day7 逻辑运算

目录&#xff1a; 前言 1.逻辑运算 2.优先级 3.易错点 4.思维导图 前言 算术运算用来进行数据的计算和处理&#xff1b;比较运算是用来比较不同的数据&#xff0c;进而来决定下一步怎么做&#xff1b;除此以外还有一种运算叫做逻辑运算&#xff0c;它的应用场景也是用来影…

【搭建WebDAV服务手机ES文件浏览器远程访问】

文章目录 1. 安装启用WebDAV2. 安装cpolar3. 配置公网访问地址4. 公网测试连接5. 固定连接公网地址6. 使用固定地址测试连接 有时候我们想通过移动设备访问群晖NAS 中的文件,以满足特殊需求,我们在群辉中开启WebDav服务,结合cpolar内网工具生成的公网地址,通过移动客户端ES文件…

2023腾讯云轻量应用服务器配置表大全2核2G/2核4G/4核8G/8核16G

腾讯云轻量应用服务器&#xff08;TencentCloud Lighthouse&#xff09;是新一代开箱即用、面向轻量应用场景的云服务器产品&#xff0c;助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、APP、电商应用、云盘/图床和开发测试环境&#xff0c;相比普通云…

01_Redis单线程与多线程

01——Redis单线程与多线程 一、Redis是单线程还是多线程 在谈Redis的单线程或多线程时&#xff0c;需要根据版本来区分。 在redis 3.x之前&#xff0c;redis是单线程的从redis 4.x开始&#xff0c;redis引入多线程。处理客户端请求时&#xff0c;使用单线程&#xff1b;在异…

二维码智慧门牌管理系统:推动企业办公信息化发展的利器

文章目录 前言一、利用二维码智慧门牌管理系统提升企业管理效率二、实现企业信息互通与协作的新模式三、数据安全性与隐私保障 前言 随着科技的不断发展&#xff0c;中国的行政机构改革不断深化&#xff0c;社会也在快速智能化的进程中不断前进。这背景下&#xff0c;传统的纸…