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…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...