多线程处理任务案例(同步锁+StopWatch+CountDownLatch)

用 C# Stopwatch 计时,让代码性能飞起来! Stopwatch 是一个内置于 .NET 的性能计时工具,它可以精确测量时间间隔,特别适用于评估分析代码执行时间和性能。本文将通过一个实战示例带你深入了解 Stopwatch 的强大功能及其在日常开发中的应用 阅读详情

今天抽空写了一个通过spring线程池来实现多线程处理任务的性能问题。这个代码相对简单,文字描述相对较少。大家有疑问可以回复。

1、任务线程代码

package com.yufeicms.test;

import java.util.concurrent.CountDownLatch;

public class MyThread implements  Runnable{

    private  int  currentIndex;//当前待处理的任务下标

    private  int  maxIndex;//最大小标

    private int[] idArr;//任务数据ID

    private Object  obj = new Object();//做同步锁

    private CountDownLatch countDownLatch;//监听所有线程任务执行完毕

    public MyThread(int[] idArr, CountDownLatch countDownLatch){
        this.maxIndex = idArr.length-1;
        this.idArr = idArr;
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
         while (true){
             if(currentIndex > maxIndex){
                 break;
             }
             int  id;
             synchronized (obj){
                 if(++currentIndex > maxIndex){
                     break;
                 }
             }
             id = idArr[currentIndex];
             handle(id);
         }
        countDownLatch.countDown();
    }

    private  void  handle(int id){
        System.out.println("开始处理"+Thread.currentThread().getName()+"文章ID:"+id);
        try{
            Thread.sleep(1000);//模拟处理任务
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("结束处理"+Thread.currentThread().getName()+"文章ID:"+id);
    }
}

2、测试类代码

package com.yufeicms.test;

import org.apache.commons.lang3.time.StopWatch;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        int nThreads = 10;
        ExecutorService pool = Executors.newFixedThreadPool(nThreads);
        CountDownLatch countDownLatch = new CountDownLatch(nThreads);
        StopWatch stopWatch = new StopWatch();
        int[]  idArr = new int[100];
        for(int i =0 ; i< 100; i++){
            idArr[i]=i+10000;
        }
        stopWatch.start();
        MyThread myThread = new MyThread(idArr,countDownLatch);
        for(int i=0;i<nThreads;i++){
            pool.execute(new Thread(myThread));
        }
        countDownLatch.await();
        stopWatch.stop();
        System.out.println("执行完所有任务所需时间:"+stopWatch.getTime()/1000+"秒");
        pool.shutdown();
    }
}

3、测试结果大致如下:

    

4、总结

1、由于任务并未做具体事情,通过Thread.sleep()方法,所以cpu资源是让出来了的。所以线程数*耗时=任务数;

2、代码中使用stopwatch用来计时;

3、代码中使用CountDownLatch来保证时间的准确性。

  
  
WRF中使用ERA5再分析数据    本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ...... 阅读详情

相关推荐

普冉PY32F003定时器实战:从HSE时钟配置到500ms精准闪烁LED(附完整代码)

本文详细解析了普冉PY32F003单片机定时器的实战应用,从HSE时钟配置到实现500ms精准LED闪烁。通过完整的代码示例和深入的技术分析,帮助开发者掌握定时器参数计算、中断优先级管理及调试技巧,适用于各类嵌入式开发项目。

weixin_30608503的博客 452

StopWatch单线程问题及多线程ConcurrentStopWatch解决方案

相信很多人都知道,spring-core中有个非常实用的监控类StopWatch,在Spring Boot应用启动过程中也有使用,可以监控代码段执行耗时以及占整个监控过程耗时百分比,这样很容易监控出比较耗时的代码,及时发现问题,优化性能。但不足的是,StopWatch是个线程不安全的工具类,不能用于多线程环境,因此基于StopWatch的不足,自定义组件`mbyx-component-concurrent-stopwatch`提供一个多线程版本的ConcurrentStopWatch便于在多线程环境监控代码

因为热爱,所以付出 1万+

视觉SLAM与激光SLAM简单对比分析

本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。

超爱吃小蛋糕的66的博客 3854

多线程、线程池、StopWatch、CountDownLatch实战

目录业务场景代码结构UserController.javaUser.javaUserThreadHandle.javaUserMapper.javaUserMapper.xmlUserService.javaUserServiceImpl.java运行结果: 业务场景 使用Java代码尽可能快地修改全部用户的密码为“123456”。 1.500万大数据批处理; 2.多线程的使用; 3.线程池; 4.StopWatch 计时; 5.CountDownLatch 计数器。 (此处只是举例多线程、线程池的

ACGkaka的博客 1378

GD32 TLI+IPA实战:5分钟搞定RGB888屏幕显示,并开启2D图形加速

本文详细介绍了如何使用GD32微控制器的TLI和IPA功能快速驱动RGB888屏幕并开启2D图形加速。通过硬件配置、时序设置和显存管理,开发者可以高效实现图形界面渲染,并利用IPA加速器提升性能,适用于嵌入式GUI开发等场景。

weixin_29163797的博客 232

Mac M1安装Hive

如果你确定装过mysql,但是执行上述命令后,发现不存在mysql命令,那说明你的系统环境没有配置。出现一段空白,接着出现Initialization script completed。关闭hiveServer2时,执行如下命令查看hive进程;执行上面命令后,若有结果输出,则证明配置完成了。如果出现mac权限问题,解决方法参考。就可以见到hive的web界面了。若出现路径,则存在mysql。配置好后保存,使配置文件生效。用户名hive,密码hive。用户名通过如下命令查看。通过如下命令杀死该进程。

总结复盘,才能不迷失自己! 2388

StopWatch类功能增强

多线程、多方法下使用的stopwatch类

OrPis的专栏 572

别再傻傻分不清!Synopsys DC综合中link/target/symbol/synthetic四大库的保姆级配置指南

本文详细解析了Synopsys DC综合中link_library、target_library、symbol_library和synthetic_library四大库的配置方法,帮助工程师避免常见错误。通过实战示例和调试技巧,指导如何正确设置工艺库与IP库,提升数字芯片设计效率。

weixin_42562079的博客 423

java计时工具StopWatch的使用

作为一名程序猿,有时为了查看代码执行效率,以下代码肯定不少写: long start = System.currentTimeMillis(); // do something... long end = System.currentTimeMillis(); System.out.println(start-end); 上面这段代码,只要是个java程序猿肯定都写过,问题是写个一两次还...

nmvbliy的专栏 2751

大疆FPGA/芯片开发工程师(A卷)笔试题(含详解)

大疆芯片开发岗A卷 一、单选题 1.下列关于多bit数据跨时钟域的处理思路,错误的有   A、发送方给出数据,接收方用本地时钟同步两拍再使用   B、发送方把数据写到异步fifo,接收方从异步fifo里读出   C、对于连续变化的信号,发送方转为格雷码发送,接收方收到后再转为二进制   D、发送方给出数据,发送方给出握手请求,接收方收到后回复,发送方撤销数据 2.对12.918做无损定点化,需要的最小位宽是多少位,位宽选择11位时的量化误差是多少   A、12位,0.0118   B、13位,0.0039

Mr.翟的博客 2万+

YOLOv8改进 | Conv篇 | 利用YOLO-MS的MSBlock轻量化网络结构(既轻量又长点)

本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块,我们将其用于C2f中组合出一种新的结构,来替换我们网络中的模块可以达到一种轻量化的作用,我将其用于我的数据集上实验,包括多个类别的数据集,其在轻量网络结构的同时,却能够提高一定的mAP精度,所以这是一种十分高效的模块,该网络结构非常适合那些模型精度已经无法提到,想要从轻量化模型的角度入手的读者使用。欢迎大家订阅本专栏,本专栏每周更新3-5篇最新机制,更有包含我所有改进的文件和交流群提供给大家。

Snu77的博客 6095

记springframework框架中的一个实用计时工具类StopWatch

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/gxs1688/article/details/87185030 StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),适用于同步单线程代码块。  正常情况下,我们如果需要看某段代码的执行耗时,会通过如下的方式进行查看: public static void m.

坎坎坷坷 516

Python爬虫实战:全面采集国家自然科学基金项目数据的全流程指南

国家自然科学基金委员会(NSFC)支持基础研究、应用基础研究,是我国科研投入的核心项目之一。公开的项目数据包括项目名称、负责人、资助金额、年度、单位等,具备极高科研和数据分析价值。requests:基础HTTP请求库,简单直观:异步HTTP请求库,适合大规模并发:HTML解析,提取数据:处理JavaScript渲染网页pandas:数据分析与清洗:数据库存储:重试机制实现。

2201_76125261的博客 753

串行化执行、并行化执行

可以将多个任务编排为并行和串行化执行。也可以处理编排的多个任务的异常,也可以返回兜底数据。

小丁的博客 838

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

基于redis分布式锁实现的多线程并发程序(原创)

前两个版本的代码 都或多或少存在一定的问题,虽然可能微乎其微,但是程序需要严谨再严谨 第一个版本问题: 局限于单机版,依赖于 Jvm的锁 第二个版本问题: 极端情况下,解锁逻辑的问题,线程B的锁,可能会被线程A解掉,这种情况实际上是不合理的。 1.由于是客户端自己生成过期时间,所以需要强制需要分布式下每个客户端的时间必须同步。 2.当锁过期的时候,如果多个客户端同时执行jedis.getSet()方法,那么虽然最终只有一个客户端可以加锁,但是这个客户端的 锁的过期时间可能被其他客户端覆盖。...

zhangge3663的博客 471

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JUnit 4.12 新特性全解析:断言增强、命令行过滤、超时机制、Rules 与 Theories 实战指南

本文以 JUnit 4 的发布说明 [doc/ReleaseNotes4.12.md](https://link.gitcode.com/i/0ac6b01e0d3cdaf8ed5f422efbdaac29) 为主线,系统梳理 JUnit 4.12(即 4.11 → 4.12 之间)在断言 API、命令行过滤、测试运行器、异常测试、超时规则、参数化测试、Rules、Theories、Categor

gitblog_01160的博客 500

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

面试小结_20240225

20240225,面试小结

weixin_45704458的博客 953

java八股文极速版

时间和空间的权衡 值越高空间开销小但是增加了查找开销服务于从Key映射到index的Hash算法,在性能和内存的使用上取平衡,实现一个尽量均匀分布的Hash函数,选取16,是通过位运算的方法进行求取的。线程安全:当多线程执行同一段程序的时候,如果发生了和预期结果不一致的情况,就是线程不安全的,如果和预期结果一致就是线程安全的,可以加锁解决(把并行运行的线程变成串行化执行)。1.加锁 利用Synchronized或者ReenTrantLock来对不安全对象进行加锁。

PassionAnytime的博客 382

StopWatch与ThreadLocal

叫做本地线程变量,中填充的的是当前线程的变量,该变量对其他线程而言是封闭且隔离的,为变量在每个线程中创建了一个副本,这样每个线程都可以访问自己内部的副本变量.因为每个Thread内有自己的实例副本,且该副本只能由当前Thread使用,这也是ThreadLocal命名的由来。既然每个Thread都有自己的实例副本,且其他Thread不可访问,那就 不存在多线程共享的问题。每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal变量通常被修饰。

铁马冰河入梦来 1134

程序监控之StopWatch

StopWatch 是 属于 spring core 下的: org.springframework.util.StopWatch StopWatch可以监控多个任务执行,并且可以分别打印出消耗的时间,还提供了线程名自定义的操作。 例子: public static void main(String[] args) throws Exception { // id 可以随意修改,最好使用唯一性的ID 方便日志分析 String id = UUID.rando.

HDXxiazai的博客 575

用StopWatch 统计代码耗时

用StopWatch统计代码耗时

CBeann的博客 538

StopWatch:被忽视的任务执行时间监视器

背景引入 学习源码的过程中,在springboot启动类的run方法里,看到这样一个对象,遂对其学习了一番。 简介 StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),适用于同步单线程代码块。用于代码性能监控,不用于实际业务。 允许多个任务的计时,暴露每个命名任务的总运行时间和运行时间。隐藏使用System.currentTimeMillis(),提高应用程序代码的可读性并减少计算错误的可能性。 源码学习 附上中文

Roker 2886

java ThreadPoolExecutor多线程任务执行结束后线程池退出

java多线程任务执行结束后线程池退出

zlpzlpzyd的专栏 1006

【Java中的StopWatch】计时利器的深度解析与使用指南

在Java编程中,StopWatch是一个非常有用的工具,尤其在需要对程序的某个部分进行精确的时间测量时。

hao_haiyang的博客 1809

项目开发之Spring多线程事务如何一起提交一起回滚(附代码),并发处理批量数据,实现多线程事务回滚,事务补偿

目录 测试代码 结果: 封装的工具类: PS:测试已通过,部分数据操作,全部数据回滚,检查数据库无数据插入。 测试代码 @SpringBootTest @RunWith(SpringRunner.class) public class PlantTest { @Autowired private PlantService plantService; @Autowired private TransactionThreadPoolExecutor execut

Seven71111的博客 4804

Spring 计时器 StopWatch

有时候要测试某个东东的执行效率,每次都得写一堆 System.currentTimeMillis(),很显然一般会封装一下,避免重复造轮子,可以直接使用 Spring 提供的工具 StopWatch。其实在 Spring Boot 程序启动后都会打印的启动时间,也是基于这个类来的: 2020-04-25 17:09:41.468 INFO 60479 --- [ main] ...

【欢迎关注公众号:冬瓜白】 1018
上一篇: 通过CountDownLatch模拟高并发下测试各种单例模式的执行结果
下一篇: docker-compose搭建mongodb分片集群及安全身份认证(实战)
yufei_java
博客等级 码龄10年 18粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值