手把手带你了解《线程池》

news/2024/4/30 5:13:15/文章来源:https://blog.csdn.net/owww_zpl/article/details/130218950

文章目录

    • 线程池的概念
    • 池的目的
    • 线程池的优势
    • 为什么从池子里拿线程更高效?
    • 构造方法参数讲解
    • 线程拒绝策略
    • 模拟实现线程池
    • 一个线程池设置多少线程合适?

线程池的概念

线程池:提前把线程准备好,创建线程不是直接从系统申请,而是从池子里拿,线程不用了还给池子。
复用线程,平摊线程的创建与销毁的开销代价

池的目的

池的目的是提高效率,线程的创建虽然比进程轻量,频繁创建,开销也不可忽略

线程池的优势

1、避免了线程的重复创建与开销带来的资源消耗代价
2、提升了任务响应速度,任务来了直接选一个线程执行而无需等待线程的创建
3、线程的统一分配和管理,也方便统一的监控和调优

为什么从池子里拿线程更高效?

从池子里拿线程:纯粹的用户态操作。
从系统创建线程:涉及到用户态和内核态的切换,真正的切换是在内核态完成的。

结论:纯用户态操作时间可控,涉及到内核操作不可控。

构造方法参数讲解

在这里插入图片描述

参数说明
corePoolSize核心线程数
maximumPoolSize最大线程数
keepAliveTime线程保持存活时间
TimeUnit unit时间单位
workQueue因为线程池要管理很多任务,这些任务通过阻塞队列来阻止的,程序员可以手动给线程池一个阻塞队列。submit方法就是把任务放到队列中
threadFactory工厂模式,创建线程的辅助类
handler线程池拒绝策略

线程拒绝策略

在这里插入图片描述
1、如果满了,继续添加任务,添加操作跑出异常。
2、添加的线程自己负责执行这个任务。
3、丢弃最老任务
4、丢弃最新的任务

模拟实现线程池

package Test1;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class ThreadDemo3 {//阻塞队列,添加任务private BlockingQueue<Runnable>queue=new LinkedBlockingQueue<>();//将任务添加到队列中public void submit(Runnable runnable){try {queue.put(runnable);} catch (InterruptedException e) {throw new RuntimeException(e);}}//定义线程数量public ThreadDemo3(int n){for(int i=1;i<=n;i++){Thread t=new Thread(()->{while(true) {try {Runnable runnable = queue.take();//取任务runnable.run();//执行任务} catch (InterruptedException e) {e.printStackTrace();}}});//启动线程t.start();}}
}

一个线程池设置多少线程合适?

首先
线程并不是越多越好,多少合适取决于CPU。
其次
不同程序,线程要做的活也不一样;
1、CPU密集型任务,主要做一些计算工作,要在CPU上运行。
2、IO密集型任务,主要是等待IO操作,不咋吃CPU
假设,你的线程全是任务全是使用CPU密集型任务,线程数就不能超过核心数(逻辑核心数),如果是IO任务则可以超过核心数。
但是具体还是要通过测试方式来确定(计算执行时间,同时检测资源使用状态,测试多次取均值)。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25K测试老鸟6年经验的面试心得,四种公司、四种问题…

这里总结了下自己今年的面试情况 先说一下自己的个人情况&#xff0c;普通二本计算机专业毕业&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能。趁着金三银四跳槽季&#xff0c;面试字节跳动测试岗技术面都已经过了&#xff0c;本来以为是…

如何把Spring Boot的Jar包做成exe?生成自己的程序,超详细教程奉上

近期做了一个前后端合并的spring boot项目&#xff0c;但是要求达成exe文件&#xff0c;提供给不懂电脑的小白安装使用&#xff0c;就去研究了半天&#xff0c;踩了很多坑&#xff0c;写这篇文章&#xff0c;是想看到这篇文章的人&#xff0c;按照我的步骤走&#xff0c;能少踩…

火山引擎边缘云,助力业务敏捷创新

[中国&#xff0c;上海&#xff0c;4 月 18 日]2023 春季火山引擎 FORCE 原动力大会正式举办。大会主论坛&#xff0c;火山引擎总裁谭待围绕云上增长三要素发表了重要演讲。在敏捷迭代专题中&#xff0c;谭待分享了火山引擎边缘云连接与计算无处不在的理念&#xff0c;并于现场…

【Jenkins 2.x 实践指南】1.4 软件工程生产力--章节小结

目录 一、生产力三要素 1. 生产力 2. IT 中的生产力 二、Devops 和 Jenkins 1. DevOps 模式定义(AWS官方定义) 2. DevOps 实践经验 2.1 持续集成 2.2 持续交付 2.3 微服务 2.4 基础设施即代码 2.5 监控和日志记录 2.6 沟通与合作 一、生产力三要素 1. 生产力 劳动…

大数据之Spark部署模式

文章目录 前言一、Spark的部署模式&#xff08;一&#xff09;Client模式1. Standalone集群下的Client模式2. Spark On Yarn集群下的Client模式 &#xff08;二&#xff09;Cluster模式1. Standalone集群下的Cluster模式2. Spark On Yarn集群下的Cluster模式 总结 前言 #博学谷…

【STC8A8K64D4开发板】——有源蜂鸣器鸣响控制

学习目的 掌握有源蜂鸣器驱动电路的设计&#xff1a;控制方式、限流电阻的计算和确定。了解有源蜂鸣器的特性以及和无源蜂鸣器的区别。 硬件电路设计 开发板上的蜂鸣器驱动电路如下图所示&#xff0c;使用的蜂鸣器是3V有源蜂鸣器&#xff0c;这里&#xff0c;我们有必要了解…

【JavaScript】6.DOM

文章目录 DOM1. 简介2. 获取元素2.1 根据 ID 获取2.2 根据标签名获取2.3 通过 HTML5 新增的方法获取2.4 特殊元素获取 3. 事件基础3.1 事件概述3.2 事件三要素3.3 执行事件步骤 DOM 1. 简介 文档对象模型&#xff08;Document Object Model&#xff0c;简称 DOM&#xff09;&…

小红书达人种草怎么收费?

随着小红书平台的快速发展&#xff0c;用户数量在不断的上升&#xff0c;市场上也涌现出了很多的小红书营销公司&#xff0c;小红书营销主要是以小红书代写代发、品牌植入广告等方式来做品牌种草品宣。 小红书达人种草怎么收费这个问题&#xff0c;相信很多商家朋友都非常关心…

Flutter开发日常练习-pageview滑动视图动画

养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 学着写一下滑动页面 pageview实现左右滑动视图 class SlidingContainer extends StatefulWidget {const SlidingContainer({super.key});overrideState<SlidingContainer> createState() > _Slidi…

2023零基础快速跟上人工智能第一梯队

写在前面&#xff1a;有关人工智能学什么&#xff0c;怎么学&#xff0c;什么路线等一系列问题。我决定整理一套可行的规划路线&#xff0c;希望帮助准备入门的朋友们少走些弯路。 下面我会推荐一个比较快速可行的学习模板&#xff0c;并附上我认为比较好的学习资料。 新手不建…

设计模式:创建者模式 - 适配器模式

文章目录 1.概述2.结构3.类适配器模式4.对象适配器模式5.应用场景6.JDK源码解析 - Reader 与 InputStream 1.概述 如果去欧洲国家去旅游的话&#xff0c;他们的插座如下图最左边&#xff0c;是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑&#xff0c;手机…

apache 配置与应用以及网页优化

Apache 配置与应用 --------构建虚拟 Web 主机-------- 虚拟Web主机指的是在同一台服务器中运行多个Web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为“虚拟”Web 主机。 通过虚拟 Web 主机服务可以充分利用服务器的硬件资源&#xff0c…

垃圾回收相关算法

标记阶段的算法 垃圾标记阶段&#xff1a;对象存货判断 在堆里存放着几乎所有的Java对象实例&#xff0c;在GC执行垃圾回收之前&#xff0c;首先需要区分出内存中哪些是存活对象&#xff0c;哪些是己经死亡的对象。只有被标记为己经死亡的对象&#xff0c;GC才会在执行垃圾回…

浏览器插件官方demo学习(五):键盘快捷键、数据缓存、网络请求监听

键盘快捷键 这个demo主要是介绍了&#xff0c;通过自定义键盘快捷键的方式来触发扩展。 必须要在manifest.json文件中添加commands属性组合键&#xff1a;使用组合键时必须包含 Ctrl 或 Alt 细节不介绍&#xff0c;可以自行查看官方文档。这里只看一下常用的东西。 定义组合…

【C++STL精讲】优先级队列(priority_queue)与双端队列(deque)

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;优先级队列——priority_queue&#x1f338;什么是优先级队列&#xff1f;&#x1f338;优先级队列的基本使用&#x1f338;什么是仿函数&#xff1f;&#x1f338;优先级队列的模拟实现 &#x1f337;双端队…

vue element-ui web端 引入高德地图,并获取经纬度

发版前接到一个临时新需求 &#xff0c;需要在web端地址选择时用地图&#xff0c;并获取经纬度。 临阵发版之际加需求&#xff0c;真的是很头疼&#xff0c;于是赶紧找度娘&#xff0c;找api。 我引入的是高德地图&#xff0c;首先要去申请key &#xff0c; 和密钥&#xff0c;…

20230420使用逻辑分析仪测量摄像头的PAG7920的时钟信号

20230420使用逻辑分析仪测量摄像头的PAG7920的时钟信号 2023/4/20 19:14 在CV1826平台&#xff1a; 1、vsync信号&#xff1a;刷新率120HZ PAG7920LT: Ultra-Low Power Global Shutter Image Sensor Max. Frame Rate 180 FPS 20KSa/20KHZ 2、href行同步信号&#xff1a;KHZ级别…

Vulnhub项目:JANGOW 1.0.1

靶机地址&#xff1a;Jangow: 1.0.1 ~ VulnHub 渗透过程&#xff1a; kali ip&#xff1a;192.168.56.104&#xff0c;使用arp-scan -l查看到靶机ip192.168.56.118 对靶机进行端口探测&#xff0c;发现了21、80端口 访问80端口&#xff0c;发现site目录 点击进去后&#xff0…

【Linux】使用systemd设置开机自启动命令

目录 1 使用使用systemd实现开机自动运行命令1.1 新建一个.service文件1.2 编写.service文件1.2.1 [Unit]1.2.2 [Service]1.2.3 [Install] 1.3 启动服务并设置自启动 2 编写Systemd服务文件的要点2.1 Systemd服务文件的位置2.2 Systemd服务文件的格式2.3 Systemd服务文件的基本…

Spring事务(3)-TransactionInterceptor实际事务执行

Spring事务&#xff08;2&#xff09;-EnableTransactionManagement实现源码解析 中介绍了Spring事务开启和代理的实现&#xff0c;现在了解实际事务执行TransactionInterceptor。 TransactionInterceptor TransactionInterceptor类图 MethodInterceptor&#xff1a;AOP代理后…