新手多线程使用详细教程以及讲解

C++从入门到精通系列教程之第十二篇:多线程编程 多线程编程允许程序同时运行多个执行流,从而充分利用多核处理器的计算资源,实现并发任务处理。提高性能:将耗时任务分配到多个线程中并行执行,可大幅提升程序效率。响应性更佳:在用户界面程序中,后台线程可以处理耗时操作,而前台界面保持流畅响应。资源共享:线程之间可以共享数据,但这也可能引发数据竞争问题,需要同步机制保证数据一致性。在C++11中,标准库提供了来简化多线程编程,同时配合std::mutex等同步机制,可以有效地管理线程间的数据访问。 阅读详情

多线程使用详细教程以及讲解

一、构建线程池

不少人会疑问为什么要构建线程池,而不是使用的时候去new线程呢?
答案主要有一下三点:
1.节约资源
复用已有的线程,减少创建线程、销毁线程浪费的资源。
2.提升速度
当有任务来的时候直接,不用等待新线程的创建,直接复用已用的线程
3.方便管理
可以控制线程的最大并发数,当线程超过规定数量时,统一回收等

通俗来讲:如果你每次调用方法都去new线程,当这个任务并发量足够大的时候,很有可能因为创建的线程数量过多而导致系统死机。

/**
     * 创建固定长度线程池 允许自定义线程数<=20
     * 固定缓冲队列长度 500 防止无限制添加任务使内存溢出
     * @param threadLen
     * @return ExecutorService
     */
    public static ExecutorService buildExecutorService(int threadLen){
        ExecutorService executorService= new ThreadPoolExecutor(Math.min((threadLen + 1), 10),
                (Math.min((threadLen + 1), 10))*2,
                2,
                TimeUnit.SECONDS,
                new LimitedQueue<>(500),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
        return executorService;
    }

二、线程池的使用
1.获取线程

    ExecutorService executorService= ThreadExportUtils.buildExecutorService(10);

2.使用多线程来执行业务代码

	for (String  data : list) {
      Runnable runnable = new Runnable() {
        @Override
        public void run() {
          //业务代码--start
          //业务代码--end
        }
      };
      executorService.execute(runnable);
    }

3.如果需要等所有线程执行完再去做其他操作,可以添加一些阻塞的代码(方式有很多种,这里我用一个计数器来实现)

	//往集合里面塞数据
	List<String> result = new ArrayList<>();
	CountDownLatch countDownLatch = new CountDownLatch(list.size());
    for (String  data : list) {
      Runnable runnable = new Runnable() {
        @Override
        public void run() {
          //业务代码--start 
	      String a = serviceImpl.getData(data);
	      result.add(a);
	      //业务代码--end
          countDownLatch.countDown();
        }
      };
      executorService.execute(runnable);
    }
  
	countDownLatch.await();//这里要处理一下异常
	//执行到这里的时候result中的结果就是所有线程执行完后的结果
	System.out.println("result = " + result);

4.使用工具类实现

	List<String> result = new ArrayList<>();
	List<CompletableFuture<Void>> futureList = new ArrayList<>();
    for (String  data : list) {
	    CompletableFuture<Void> courseTake = CompletableFuture.runAsync(() -> {
	       //业务代码--start 
	       String a = serviceImpl.getData(data);
	       result.add(a);
	       //业务代码--end
		}, executorService);
		futureList.add(courseTake);
    }

	//阻塞
	CompletableFuture<Void>[] completableFutures = futureList.toArray(new CompletableFuture[]{});
    CompletableFuture<Void> allOf = CompletableFuture.allOf(completableFutures);
    allOf.get();
    
	//执行到这里的时候result中的结果就是所有线程执行完后的结果
	System.out.println("result = " + result);
(十四)【Jmeter】线程(Threads(Users))之开放模型线程组(Open Model Thread Group) 开放线程组(Open Model Thread Group)参数说明及操作示例讲解 阅读详情

相关推荐

Java多线程新手指南:从零开始学习多线程创建,有两下子!

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2428

Jmeter 5.5版本发布说明

Jmeter 5.5版本发布说明

软件测试大叔 4528

射频总集篇:(不断更新)

射频每一章涉及到的重点理论/设计方法 CHAPTER 1 传输线理论 输入阻抗Zin,负载阻抗ZL,驻波比ρ,反射系数 CHAPTER 2 波导 矩形波导,圆波导,同轴线 CHAPTER 3 微型带状传输线 微带线的参数设计,带状线的参数设计 CHAPTER 4 ...

jieyannn的博客 1919

JMeter简单使用

jmeter

u012023658的博客 1475

Cadence IC618与Spectre231安装配置全攻略:License、环境变量与依赖检查

EDA工具部署中,License管理与环境变量隔离是核心难点。FlexLM作为通用授权机制,通过守护进程和端口配置实现工具授权;环境变量则控制工具路径与库加载顺序,避免版本冲突。合理配置可确保IC618与Spectre231稳定运行,提升仿真效率。典型应用场景包括模拟IC设计、高校实验室及企业级EDA环境。本文聚焦Cadence IC618与Spectre231的安装实践,详解License配置、环境隔离及依赖检查,助你快速搭建可靠设计环境。

weixin_28721917的博客 324

Unity热更实战:用YooAsset+HybridCLR实现小游戏资源与代码双更新(含避坑清单)

本文详细介绍了Unity小游戏开发中如何通过YooAsset与HybridCLR实现资源与代码双热更新方案。内容涵盖环境配置、架构设计、微信小游戏专项优化、热更代码工程化实践及真机调试技巧,帮助开发者解决审核周期长、紧急修复等痛点,提升更新效率与稳定性。

weixin_42520025的博客 501

Jmeter中的线程

假设我们需要测试一个Web应用,模拟100个用户并发访问,并且每个用户在执行每个样本之间有随机的延迟时间。假设我们需要测试一个Web应用,模拟100个用户并发访问,并且每个用户执行测试脚本10次。假设我们需要在一个Web应用性能测试结束后,删除所有生成的临时文件并关闭数据库连接。假设我们需要在一个Web应用性能测试开始前,创建数据库表并插入一些初始数据。通过合理配置和优化线程组,可以有效地模拟用户行为,提高测试的准确性和可靠性。

. 2607

拼多多小球直径轨迹重合验证码识别

本文分析了拼多多新型验证码的实现原理与破解思路。该验证码采用Canvas绘制小球弹跳轨迹验证,主要难点在于参数还原和轨迹计算。作者通过逆向工程提取了包括弹跳段数、振幅、旋转参数等关键配置(存储在config.json),并利用Python成功模拟了验证过程。核心算法将滑块值映射为0-1区间,通过三次变换计算小球位置,最终采用斜率截距最小值比对完成验证。整个过程分为静态初始化、核心计算和动态渲染三个阶段,其中干扰元素不影响核心验证逻辑。该研究仅用于技术学习,强调严禁任何违法行为。

码王吴彦祖的博客 1322

Jmeter系列(7)-线程组

每个线程都会独立的运行测试计划,互不干扰,多个线程用于模仿对服务器的并发访问。

打不完哈欠O_O 524

PCL实现STL文件读取和转换为PCD格式

本文介绍如何使用点云库(Point Cloud Library,PCL)读取STL(Standard Triangle Language)文件,并将其转换为点云数据(PointCloud Data,PCD)格式。通过将STL文件转换为PCD格式,我们可以更方便地处理和分析点云数据。本文介绍了如何使用PCL库读取STL文件并将其转换为PCD格式的点云数据。以上是关于PCL读取STL文件并转存为PCD格式的简要介绍和示例源代码。下面的示例展示了如何将STL文件转换为PCD格式。函数将点云数据保存为PCD文件。

ByteEchoX的博客 804

R语言glm函数构建二分类logistic回归模型、epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值

R语言glm函数构建二分类logistic回归模型(family参数为binomial)、使用epiDisplay包logistic.display函数获取模型汇总统计信息(自变量初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)

statistics+insight+vista+power 1397

MFC笔记之多线程聊天室

新手刚接触,跟着孙鑫老师视频一步一步的做。从VC6.0到VS2010好像并不是那么顺利,下面记录下一点收获。 网络编程的一般步骤: 1声明套接字版本(WSAStartup);2创建套接字(socket);3绑定套接字(bind);4发送接收(sendto/recvfrom);5关闭(closesocket) 第1~3步代码如下: 1 CString error; 2 WORD w...

weixin_33816946的博客 214

从 ST22 到根因定位:ABAP Dumps 全景排查指南(含典型 Dump 案例、修复套路与云时代实践)

本文系统介绍了SAP系统中ABAP短转储(Dump)的分析方法。首先指出短转储是程序运行时无法处理的错误导致系统强制终止执行。文章详细解析了短转储报告各区块的作用:从概述性的Short Text和What happened,到核心的Error Analysis和Source Code Extract,再到关键的系统字段Contents of system fields和调用栈Active Calls/Events。针对不同场景提供了排查建议:客户代码应建立可控边界,标准对象优先查阅SAP Notes。最后推

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 481

新手学习多线程的详细思路和流程

  最近在博客园中逛,看到多线程想学习一下,虽然作者本人感觉挺详细的,但对于新手没学过多线程理解还是有难度的,最多也就是明白大概意思,自己写还是一片空白,我看过多个博客以后觉得还需要打代码才能彻底理解多线程,以下以一个经典多线程题目为例,一个菜鸟解题的具体步骤:   题目:建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。...

dengwahuang2250的博客 183

COMSOL介电弹性体数值仿真指南:预拉伸圆形DEA的稳态变形分析(II)

本期博客是《COMSOL介电弹性体数值仿真指南》系列博客中的一期。聚焦于介电弹性体驱动器(DEA)中最为经典的预拉伸圆形DEA驱动器构型,对其在COMSOL平台中的具体建模步骤进行介绍与讨论。

忘了面孔的Batou 353

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python 多线程与多进程入门:从理论到实战,新手也能懂

线程是程序执行的最小单位,一个程序至少有一个线程(主线程)。多线程就是在一个程序中同时运行多个线程,它们共享同一块内存空间。优点启动快,资源消耗少线程间通信方便(共享内存)缺点受 Python 全局解释器锁(GIL)限制,无法真正利用多核 CPU线程崩溃可能导致整个程序崩溃进程是程序的一次执行过程,每个进程有独立的内存空间。多进程就是同时运行多个程序副本,它们互不干扰。优点可以利用多核 CPU,实现真正的并行计算进程崩溃不影响其他进程缺点启动慢,资源消耗大。

weixin_49336861的博客 1036

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

下载神器IDM安装与使用(保姆级教程)

下载神器IDM安装与使用(保姆级教程)

EXIxiaozhou的博客 12万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

探索Qt编程世界:Qt入门教程详细讲解版

探索Qt编程世界:Qt入门教程详细讲解版 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 欢迎来到Qt入门教程详细讲解版的世界!无论你是编程新手还是经验丰富的开发者,本教程都将为你打开Qt编程的大门。Qt作为一个功能强大、跨平台的应用程序开发框架,支持Windows、Linux、macOS等多个操作系统,广泛应用于桌面应用、移动开发乃至嵌入式系统。本教程专为初学者设计,...

gitblog_06608的博客 947

C++常用多线程函数总结(附简单讲解)

本人学习C++多线程,但发现其他博客讲解过于全面,但对于不常用的C++多线程函数,我们倒不必花费同样的时间学习,便决定写一篇只包含常用多线程函数的博客,不仅可以让读者学习更加高效,同时使自己用时查找方便。本文同时会提供简单讲解。

Xcq20230729的博客 912

Java 多线程创建学习新手指南:从零开始全面掌握多线程创建方法

Java多线程创建方法指南 摘要:本文介绍Java中两种创建多线程的主要方法:继承Thread类和实现Runnable接口。继承Thread类方式简单直接,但受限于Java的单继承特性;实现Runnable接口则更灵活,允许类继承其他类,且支持多个线程共享任务对象。文章通过代码示例展示了每种方法的实现步骤,并分析了各自的优缺点和应用场景。此外还提到Callable和Future接口可用于需要返回值的线程任务。掌握这些多线程创建方法能有效提高程序运行效率,改善用户体验,充分利用现代计算机的多核处理能力。

sss191s的博客 468

python wxpython菜鸟教程_wxpython新手向教程

wxpython教程手写wxpython会有各种问题,可以去下载wxformbuilder布局管理器然后去百度一下这个布局管理器的教程,这里太多了不多赘述。两种创建窗口方式:class MyFrame(wx.Frame)和class MyPanel(wx.Panel)来继承wx.Frame和wx.Panel,但是用wxformbuilder来创建布局和窗口会自动帮忙写好。继承wx.Frame的结尾...

weixin_39607473的博客 1667

新手必看:Keil5安装与首次使用详细教程

手把手教你完成keil5安装配置,解决常见问题,快速上手嵌入式开发环境搭建,适合初学者的实用教程。

weixin_30591519的博客 752

Python多线程入门:避开isalive()这个新手陷阱

多线程编程是Python中一个强大的功能,但也容易遇到各种陷阱。记住is_alive()只能在Thread实例上调用,不能用在主线程上。多实践、多调试是掌握多线程编程的关键。希望这篇笔记能帮助你避开这个新手常见的陷阱,祝你在多线程编程的学习路上越走越顺!

BlackironLynx23的博客 545

IDM(Internet Download Manager)详细free使用教程(附方法)

Internet Download Manager (IDM) 是一款全球用户广泛使用的下载管理工具,以其卓越的多线程下载、断点续传功能和出色的稳定性而受到青睐。IDM 支持与主流浏览器无缝集成,能够自动捕获网页中的下载链接,帮助用户轻松管理和加速下载任务。无论是视频、音频,还是大型文件,IDM 都能快速处理,并支持从 YouTube、抖音等流媒体网站下载视频,还具备定时下载、批量处理、自动化任务等高级功能,是频繁下载用户的理想选择。

iEdHu 1万+

fre:ac音频转换器终极指南:从新手到高手的完整使用教程

在当今数字化音乐时代,音频格式转换已成为音乐爱好者、内容创作者和普通用户的必备技能。fre:ac作为一款功能强大的免费音频转换工具,不仅支持从CD抓取音轨,还能实现多种音频格式的高效转换。本指南将为您提供从基础操作到高级技巧的完整解决方案。 ## 🎯 软件界面快速上手与核心功能解析 fre:ac的主界面设计直观易用,让初学者也能快速掌握音频转换的基本操作流程。 [![fre:ac音频转换器

gitblog_00748的博客 986
上一篇: linux环境启动和关闭脚本
下一篇: JAVA计算两个日期之间的自然周数
~~Whd
博客等级 码龄7年 2粉丝 18原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~~Whd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值