JAVA 多线程入门例子:CountDownLatch
- 首先确定线程数量。如果数据集合的大小小于50,就只使用一个线程;否则使用5个线程。
- 计算每个线程平均处理的数据数量
sizePerThread以及余数remainder。 - 在划分数据子集合时,对于每个线程的处理范围进行计算。如果有余数,就将余数依次分配到前面的线程中(这里是简单地让前面的线程多处理一个数据)。
- 最后一个线程的结束索引直接设置为数据集合的大小,确保能处理完所有数据。
- 每个线程在处理完自己的数据后,调用
latch.countDown(),主线程通过latch.await()等待所有线程完成任务后,再继续执行后续操作。 CopyOnWriteArrayList,它是线程安全的,适用于读多写少的场景
package com.syplatform;import static org.junit.Assert.assertTrue;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CountDownLatch;import org.junit.Test;/*** Unit test for simple App.*/
public class AppTest {/*** Rigorous Test :-)*/@Testpublic void shouldAnswerWithTrue() throws InterruptedException {CopyOnWriteArrayList<Integer> finalList = new CopyOnWriteArrayList<>();List<Integer> dataList = new ArrayList<>();for (int i = 1; i <= 101; i++) {dataList.add(i);}// 根据数据量决定线程数量int numThreads = dataList.size() < 50 ? 1 : 5;int size = dataList.size();int partSize = size / numThreads;// 处理不能整除的情况,将剩余的任务分配到前面的线程中int remainder = size % numThreads;int startIndex = 0;CountDownLatch latch = new CountDownLatch(numThreads);for (int i = 0; i < numThreads; i++) {int endIndex = startIndex + partSize + (i < remainder ? 1 : 0);List<Integer> subList = dataList.subList(startIndex, endIndex);startIndex = endIndex;Thread thread = new Thread(() -> {for (Integer num : subList) {finalList.add(num);System.out.println(Thread.currentThread().getName() + " processing " + num);}latch.countDown();});thread.start();}latch.await();System.out.println("All threads have finished processing.");assertTrue(finalList.size() == 101);}
}
相关文章:
JAVA 多线程入门例子:CountDownLatch
首先确定线程数量。如果数据集合的大小小于50,就只使用一个线程;否则使用5个线程。计算每个线程平均处理的数据数量sizePerThread以及余数remainder。在划分数据子集合时,对于每个线程的处理范围进行计算。如果有余数,就将余数依次…...
k8s jenkins 动态创建slave
k8s jenkins 动态创建slave 简述使用jenkins动态slave的优势:配置jenkins动态slave配置 Pod Template配置容器模板挂载卷 测试 简述 持续构建与发布是我们日常工作中必不可少的一个步骤,目前大多公司都采用 Jenkins 集群来搭建符合需求的 CI/CD 流程&am…...
MVS海康工业相机达不到标称最大帧率
文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …...
数据结构:用双栈实现一个队列
要用两个栈实现一个队列,可以利用“栈”的后进先出 (LIFO) 特性来模拟“队列”的先进先出 (FIFO) 操作。具体做法是使用两个栈:一个作为入栈栈,另一个作为出栈栈。 算法步骤 入队操作(enqueue): 将元素压…...
QScroller Class
Header:#include < QScroller > qmake:QT += widgets Since:Qt 5.0 Inherits:QObject This class was introduced in Qt 5.0. Public Types enum Input {InputPress, InputMove, InputRelease } enum ScrollerGestureType {TouchGesture, LeftMouseButtonGesture,…...
React高阶组件详解
React高阶组件(HOC)详解 定义 React高阶组件(HOC)是一个函数,该函数接受一个组件作为参数并返回一个新的组件。高阶组件本身不是一个组件,而是一个函数,它利用React的组合特性,对传入…...
TextView把其它控件挤出屏幕的处理办法
1.如果TextView后面的控件是紧挨着TextView的,可以给TextView添加maxWidth限制其最大长度 上有问题的布局代码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns:android"http://schemas.android.com/apk/res/android&qu…...
长度为 K 的重复字符子串数目
长度为 K 的重复字符子串 给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。 数据范围: 2≤k≤400 , 5≤n≤900 进阶: 时间复杂度O(n),空间复杂…...
html+css+js实现轮播图
实现效果: HTML部分 <div class"carousel"><div class"carousel-wrapper"><img src"./image/1.png" alt""></div><ul class"carousel-indictor"><li class"active"…...
Boost集成模型异同
一、常见Boost集成模型 AdaBoost、GBDT和XGBoost都是集成学习中的提升(Boosting)算法,它们通过组合多个弱学习器来构建一个强学习器。从经验上来说,XGBoost是诸多竞赛的大杀器,在实际业务工作中可能需要用到集成模型的…...
【系统架构设计师】案例专题四:嵌入式系统考点梳理
更多内容请见: 备考系统架构设计师-核心总结目录 摘要:本文主要梳理系统架构设计师 - 嵌入式系统 案例考点 ,主要包括嵌入式相关概念、软件和硬件可靠性、冗余技术、软件容错、集群技术、负载均衡、可维护性的评价指标、软件维护的分类等。 文章目录 一、相关概念二、软件可…...
Ngin入门套餐
快速了解Nginx 一、代理1.1 正向代理1.2 反向代理1.3 正向代理和反向代理的区别 二、Nginx负载均衡策略2.1 轮询(Round Robin)2.2 加权轮询(Weighted Round Robin)2.3 IP 哈希(IP Hash)2.4 最少连接&#x…...
使用linux编译main.cpp文件
1、首先创建一个简单的test.cpp,使用终端命令形式: touch test.cpp 创建结束,记得ls一下,如下: 2、找到创建结束的test.cpp文件,然后右键编辑,输入一个简单的代码,如下 #include …...
服务器部署Traefik 实现子级域名路由服务(对外子域名80,路由对内大端口)
文章目录 1.Traefik安装2.启动nginx配置路由 本文档只是为了留档方便以后工作运维,或者给同事分享文档内容比较简陋命令也不是特别全,不适合小白观看,如有不懂可以私信,上班期间都是在得 前言,领导让我调研在线发布得…...
@RequestParam @PathVirable @RequestBody @ApiParam的区别
RequestParam 最常用用value指定参数名字,required字段指定参数是否必须,默认为true,当requiredfalse时,一般配合着defaultValue"xx"使用对应的url是这样的: https://localhost/requestParam/test?key1va…...
Vulnhub靶场案例渗透[5]- DC4
文章目录 1. 靶场搭建2. 信息收集2.1 确定靶机ip2.2 主机信息收集2.3 主机目录探测 3. 渗透过程3.1 sql注入检测3.2 burp爆破3.3 反弹shell3.4 提权 4. 总结 1. 靶场搭建 靶场源地址 检验下载文件的检验码,对比没问题使用vmware打开 # windwos 命令 Get-FileHash …...
http协议概述与状态码
目录 1.HTTP概述 1.1请求报文起始行与开头 1.2响应报文起始行 1.3响应报文开头 2.http状态协议码 1.HTTP概述 默认端口 80 HTTP超文本传输与协议: 数据请求和响应 传输:将网站的数据传递给用户 超文本:图片 视频等 请求request:打开网站 访问网站 响应r…...
Golang 进阶5—— 反射
Golang 进阶5—— 反射 注意,该文档只适合有编程基础的同学,这里的go教程只给出有区别的知识点 反射: 反射可以在运行时动态获取变量的各种信息, 比如变量的类型、 类别等信息。如果是结构体变量,还可以获取结构体本…...
react 封装防抖
封装防抖 import React, { useRef, useEffect, useCallback } from react;function useDebounce(fn, delay) {const delayRef useRef(delay);const fnRef useRef(fn);// 更新ref值useEffect(() > {delayRef.current delay;}, [delay]);useEffect(() > {fnRef.current…...
Java项目-----图形验证码登陆实现
原理: 验证码在前端显示,但是是在后端生成, 将生成的验证码存入redis,待登录时,前端提交验证码,与后端生成的验证码比较. 详细解释: 图形验证码的原理(如下图代码).前端发起获取验证码的请求后, 1 后端接收请求,生成一个键key(随机的键) 然后生成一个验证码作为map的valu…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
