串行化执行、并行化执行
文章目录
- 1、串行化执行
- 2、并行化测试(多线程环境)
- 3、任务的执行是异步的,但主程序的继续执行是同步的
可以将多个任务编排为并行和串行化执行。
也可以处理编排的多个任务的异常,也可以返回兜底数据。
1、串行化执行
顺序执行、同步执行
按顺序同步执行
导入 StopWatch 类,这是 Spring 框架提供的一个工具类,用于测量任务的执行时间。
package com.atguigu.structure;import org.springframework.util.StopWatch;public class Demo {public static void main(String[] args) throws InterruptedException {StopWatch stopWatch = new StopWatch();// 为每个任务分别计时stopWatch.start("a任务");a();stopWatch.stop();stopWatch.start("b任务");b();stopWatch.stop();stopWatch.start("c任务");c();stopWatch.stop();// 此时,StopWatch 已经自动停止了总任务的计时(因为最后一个任务也已经停止)// 但如果您想显式地停止总任务(尽管在这个例子中它是多余的),您需要确保没有正在运行的任务// 打印结果System.out.println(stopWatch.prettyPrint());}public static void a() throws InterruptedException {Thread.sleep(3000);System.out.println(Thread.currentThread().getName() + " a任务执行完毕-" + System.currentTimeMillis());}public static void b() throws InterruptedException {Thread.sleep(2000);System.out.println(Thread.currentThread().getName() + " b任务执行完毕-" + System.currentTimeMillis());}public static void c() throws InterruptedException {Thread.sleep(1000);System.out.println(Thread.currentThread().getName() + " c任务执行完毕-" + System.currentTimeMillis());}
}
由于 a 任务最先执行,它的开始时间是 0 毫秒,结束时间是 3000 毫秒。b 任务在 a 任务结束后立即开始,因此它的开始时间是 3000 毫秒,结束时间是 5000 毫秒。c 任务在 b 任务结束后立即开始,因此它的开始时间是 5000 毫秒,结束时间是 6000 毫秒。
main a任务执行完毕-1727613404687
main b任务执行完毕-1727613406705
main c任务执行完毕-1727613407711
StopWatch '': 6.0325798 seconds
----------------------------------------
Seconds % Task name
----------------------------------------
3.0193421 50% a任务
2.007708 33% b任务
1.0055297 17% c任务
2、并行化测试(多线程环境)
多个并发任务
三个任务将并行执行
注意:这里主线程不会等待任务线程完成,因此程序可能会立即退出。
如果需要等待所有任务完成,可以使用CountDownLatch或其他同步机制。
package com.atguigu.structure;import org.springframework.util.StopWatch;public class Demo {public static void main(String[] args) throws InterruptedException {StopWatch stopWatch = new StopWatch();// 为每个任务分别计时stopWatch.start("a任务");new Thread(()->{a();}).start();stopWatch.stop();stopWatch.start("b任务");new Thread(()->{b();}).start();stopWatch.stop();stopWatch.start("c任务");new Thread(()->{c();}).start();stopWatch.stop();// 打印结果System.out.println(stopWatch.prettyPrint());}public static void a(){try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " a任务执行完毕-" + System.currentTimeMillis());}public static void b(){try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " b任务执行完毕-" + System.currentTimeMillis());}public static void c(){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " c任务执行完毕-" + System.currentTimeMillis());}
}
StopWatch '': 0.0022191 seconds
----------------------------------------
Seconds % Task name
----------------------------------------
0.0011501 52% a任务
0.0005202 23% b任务
0.0005488 25% c任务Thread-2 c任务执行完毕-1727615633886
Thread-1 b任务执行完毕-1727615634883
Thread-0 a任务执行完毕-1727615635882
StopWatch 的 start() 和 stop() 方法调用是在主线程中顺序执行的,但是实际的任务(a(), b(), c())是在不同的线程中异步执行的。这会导致 StopWatch 的 stop() 方法在相应的任务线程实际完成之前就被调用了,因此 StopWatch 记录的时间将远小于任务实际执行的时间。
3、任务的执行是异步的,但主程序的继续执行是同步的
使用f1.get(), f2.get(), f3.get()确保主线程等待这些任务完成。
- 即每个任务都使用了独立的 FutureTask 和线程实例。但是,有一点需要注意:在 main 线程中调用 f1.get(), f2.get(), 和 f3.get() 会阻塞 main 线程,直到相应的 FutureTask 完成。这实际上意味着 main 线程会等待每个任务完成后再继续执行下一个任务,这可能会使得并行执行的优势变得不那么明显,因为任务实际上是顺序执行的(尽管它们在不同的线程中运行)。
- 因此,从主线程的角度来看,这些任务并不是“真正”的异步执行,因为主线程在等待每个任务完成。然而,从操作系统或 JVM 的角度来看,这些任务确实是在不同的线程中并行执行的(如果系统资源允许的话)。
- 从全局角度来看,每个任务虽然是异步启动的,但它们依次等待完成,这使得整个程序看起来是按顺序执行的。
- 主程序通过调用 f1.get(), f2.get(), 和 f3.get() 等待每个任务完成。这意味着主程序会阻塞,直到所有任务都执行完毕。
这种方式确保了任务的执行时间能够被准确地测量,但也意味着主程序不会在所有任务完成之前继续执行其他操作。- 由于您还希望使用 StopWatch 来测量每个任务的执行时间,您需要在某个地方等待这些任务完成,所以通过调用 f1.get(), f2.get(), 和 f3.get() 在主线程中阻塞了这些 FutureTask 的执行结果。
总结来说,任务的执行是异步的,但主程序的继续执行是同步的,因为它等待所有异步任务完成。
package com.atguigu.structure;import org.springframework.util.StopWatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Demo {public static void main(String[] args) throws InterruptedException, ExecutionException {StopWatch stopWatch = new StopWatch();// 为每个任务分别计时stopWatch.start("a任务");FutureTask f1 = new FutureTask<>(() -> {a();return null;});new Thread(f1).start();f1.get();stopWatch.stop();stopWatch.start("b任务");FutureTask f2 = new FutureTask<>(() -> {b();return null;});new Thread(f2).start();f2.get();stopWatch.stop();stopWatch.start("c任务");FutureTask f3 = new FutureTask<>(() -> {c();return null;});new Thread(f3).start();f3.get();stopWatch.stop();// 打印结果System.out.println(stopWatch.prettyPrint());}public static void a(){try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " a任务执行完毕-" + System.currentTimeMillis());}public static void b(){try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " b任务执行完毕-" + System.currentTimeMillis());}public static void c(){try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName() + " c任务执行完毕-" + System.currentTimeMillis());}
}
Thread-0 a任务执行完毕-1727619923910
Thread-1 b任务执行完毕-1727619925934
Thread-2 c任务执行完毕-1727619926943
StopWatch '': 6.0475203 seconds
----------------------------------------
Seconds % Task name
----------------------------------------
3.0258235 50% a任务
2.0129727 33% b任务
1.0087241 17% c任务

相关文章:
串行化执行、并行化执行
文章目录 1、串行化执行2、并行化测试(多线程环境)3、任务的执行是异步的,但主程序的继续执行是同步的 可以将多个任务编排为并行和串行化执行。 也可以处理编排的多个任务的异常,也可以返回兜底数据。 1、串行化执行 顺序执行、…...
二叉搜索树(c++版)
前言 在前面我们介绍过二叉树这个数据结构,今天我们更进一步来介绍二叉树的一种在实现中运用的场景——二叉搜索树。二叉搜索树顾名思义其在“搜索”这个场景下有不俗的表现,之所以会这样是因为它在二叉树的基础上添加了一些属性。下面我们就来简单的介…...
每日1题-7
...
简单实现log记录保存到文本和数据库
简单保存记录到txt,sqlite数据库,以及console监控记录 using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Data.SQLite; using System.IO;namespace NlogFrame {public enum LogType{Tr…...
敏感字段加密 - 华为OD统一考试(E卷)
2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…...
go 安装三方库
go版本 go versiongo version go1.23.1 darwin/arm64安装 redis 库 cd $GOPATH说明: 这里可以改 GOPATH的值 将如下 export 语句写入 ~/.bash_profile 文件中 export GOPATH/Users/goproject然后使其生效 source ~/.bash_profile初始化生成 go.mod 文件 go mod…...
Java 中的 volatile和synchronized和 ReentrantLock区别讲解和案例示范
在 Java 的并发编程中,volatile、synchronized 和 ReentrantLock 是三种常用的同步机制。每种机制都有其独特的特性、优缺点和适用场景。理解它们之间的区别以及在何种情况下使用哪种机制,对提高程序的性能和可靠性至关重要。本文将详细探讨这三种机制的…...
从GDAL中 读取遥感影像的信息
从GDAL提供的实用程序来看,很多程序的后缀都是 .py ,这充分地说明了Python语言在GDAL的开发中得到了广泛的应用。 1. 打开已有的GeoTIF文件 下面我们试着读取一个GeoTiff文件的信息。第一步就是打开一个数据集。 >>> from osgeo import gdal…...
算法闭关修炼百题计划(一)
多看优秀的代码一定没有错,此篇博客属于个人学习记录 1.两数之和2.前k个高频元素3.只出现一次的数字4.数组的度5.最佳观光组合6.整数反转7.缺失的第一个正数8.字符串中最多数目的子序列9.k个一组翻转链表10.反转链表II11. 公司命名12.合并区间13.快速排序14.数字中的…...
vue3实现打字机的效果,可以换行
之前看了很多文章,效果是实现了,就是没有自动换行的效果,参考了文章写了一个,先上个效果图,卡顿是因为模仿了卡顿的效果,还是很丝滑的 目录 效果图:代码如下 效果图: 函数查找原因是FLASH Programming Sequence error(编程顺序错误),解决办法是在解锁后清零标志位…...
Android—ANR日志分析
获取ANR日志: ANR路径:/data/anrADB指令:adb bugreport D:\bugrep.zip ANR日志分析步骤: “main” prio:主线程状态beginning of crash:搜索 crash 相关信息CPU usage from:搜索 cpu 使用信息…...
9.29 LeetCode 3304、3300、3301
思路: ⭐进行无限次操作,但是 k 的取值小于 500 ,所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ ,单独处理使其变为 ‘a’ 得到得到操作后的新字符串,和原字符串拼接 class Solution { …...
近万字深入讲解iOS常见锁及线程安全
什么是锁? 在程序中,当多个任务(或线程)同时访问同一个资源时,比如多个操作同时修改一份数据,可能会导致数据不一致。这时候,我们需要“锁”来确保同一时间只有一个任务能够操作这个数据&#…...
linux创建固定大小的文件夹用于测试
在linux上创建固定大小的文件夹用于测试磁盘空间不足时的应用故障。 实验环境为centos7,有两种简易方法: 一、使用ramdisk 1、创建文件夹 mkdir /var/mytest 2、创建一个1m大小的临时文件 mount none /var/mytest -t tmpfs -o size1m size也可以写…...
大模型学习路线:这会是你见过最全最新的大模型学习路线【2024最新】
大模型学习路线 建议先从主流的Llama开始,然后选用中文的Qwen/Baichuan/ChatGLM,先快速上手体验prompt工程,然后再学习其架构,跑微调脚本 如果要深入学习,建议再按以下步骤,从更基础的GPT和BERT学起&…...
了解云计算工作负载保护的重要性,确保数据和应用程序安全
云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求,而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端,保护他们的云工作负载(指所有部署的应用程序和服务)变得越来越重要。云工作负载保护&…...
Swagger3基本使用
Swagger 课程目标 Swagger简介【了解】 Springboot整合swagger【掌握】 Swagger 常用注解【掌握】 knife4j-Swagger【会用】 一、Swagger3简介 Swagger 是一系列 RESTful API 的工具,通过 Swagger 可以获得项目的⼀种交互式文档,客户端 SDK 的自 动…...
如何借助Java批量操作Excel文件?
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种: 对批量的Excel文件进行操作。如导入多个Excel文件…...
超实用AI教材写作攻略!低查重工具助你快速完成教材编写!
AI教材编写工具:解决传统困境,开启高效新时代 编写教材需要丰富的资料支持,但传统的资料整合方法已经无法满足现代需求。以往,我们从课标、学术资料到教学案例,这些信息分散在知网和教研平台等多个渠道,需…...
LabVIEW标准表法开发气体流量标准装置
标准表法是气体流量计检定校准的主流方法,针对气体流量检测过程中自动化程度低、数据采集精度不足、设备控制协同性差的问题,依托 LabVIEW 图形化编程平台搭建气体流量标准装置应用系统,实现温度、压力、流量等参数的自动化采集、设备精准调控…...
基于策略模式与智能编排的抖音批量下载系统架构设计与实现
基于策略模式与智能编排的抖音批量下载系统架构设计与实现 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在当今内容驱动的互联网时代,抖音平台汇聚了海量的短视频内容。对于内容创作者、研究者…...
超越传统RPA!用Magentic-UI实现人机协作式网页自动化(含工作流调试技巧)
超越传统RPA:Magentic-UI的人机协作革命与实战进阶 当传统RPA工具还在追求"全自动"的乌托邦时,微软开源的Magentic-UI已经开辟了一条更务实的道路——人机协同智能。这个基于多智能体架构的系统不是要取代人类,而是通过"可干预…...
PostgreSQL开机启动踩坑实录:从‘服务不存在’到‘权限拒绝’的完整排错指南
PostgreSQL开机启动故障排查实战指南:从日志分析到权限修复 当你满怀期待地在服务器上执行systemctl start postgresql命令,却看到刺眼的红色报错信息时,那种挫败感我深有体会。作为一款强大的开源数据库,PostgreSQL在Linux系统上…...
基于LLM的智能客服系统实战:飞书集成与高并发架构设计
最近在做一个企业级的智能客服项目,客户要求必须集成到飞书工作台,并且要能扛住业务高峰期的并发压力。传统的规则引擎客服系统,在面对五花八门的用户提问时,经常“卡壳”,尤其是那些规则库没覆盖到的“长尾问题”&…...
RePKG完整指南:Wallpaper Engine资源提取与格式转换工具全解析
RePKG完整指南:Wallpaper Engine资源提取与格式转换工具全解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、功能解析:掌握RePKG核心能力 1.核心功能…...
使用 Java 8 Lambda 和 Map 重构 If 语句
本文介绍了如何使用 Java 8 的 Lambda 表达式和 Map 优雅重构数据结构包括多个数据结构 if 句子的代码可以提高代码的可读性、可维护性和可扩展性。存储验证逻辑 Map 中,并使用 Lambda 表达式处理可以有效减少代码冗余,使其更容易扩展新的验证规则。在传…...
3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍
3分钟搞定Windows音频捕获:win-capture-audio让你的录音效率翻倍 【免费下载链接】win-capture-audio An OBS plugin that allows capture of independant application audio streams on Windows, in a similar fashion to OBSs game capture and Discords applicat…...
vLLM-v0.17.1在新闻聚合平台的应用:热点事件摘要生成服务
vLLM-v0.17.1在新闻聚合平台的应用:热点事件摘要生成服务 1. 技术背景与需求场景 新闻聚合平台每天需要处理海量新闻内容,如何快速生成准确、简洁的热点事件摘要成为关键挑战。传统方法依赖人工编辑或简单规则提取,效率低下且质量参差不齐。…...
