Java多线程批量处理数据

package com.demo.studydemo.test;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 批量数据处理示例类。* 该类演示了如何通过多线程批量处理数据,将数据集分割成多个部分,每个部分由一个单独的线程进行处理。* @author lhj* @date 2024/04/26*/
public class BatchDataProcessingExample {/*** 程序的主入口函数。* @param args 命令行参数(未使用)* @throws InterruptedException 如果线程在等待时被中断,则抛出此异常。*/public static void main(String[] args) throws InterruptedException {// 初始化数据处理参数int dataSize = 1_000_000; // 需要处理的数据量int batchSize = 100_000; // 每个线程处理的数据量int threadCount = (dataSize + batchSize - 1) / batchSize; // 根据数据量和批量大小计算所需线程数System.out.println("需要启动" + threadCount + "个线程处理数据");// 模拟数据集List<Integer> data = new ArrayList<>(dataSize);for (int i = 0; i < dataSize; i++) {data.add(i);}// 使用CountDownLatch来同步线程CountDownLatch latch = new CountDownLatch(threadCount);// 创建线程池ExecutorService executor = Executors.newFixedThreadPool(threadCount);// 分配任务到线程池for (int i = 0; i < threadCount; i++) {int start = i * batchSize;int end = Math.min(start + batchSize, dataSize);List<Integer> subList = data.subList(start, end);executor.submit(new DataProcessor(subList, latch));}// 等待所有任务完成latch.await();System.out.println("所有数据处理完成");// 关闭线程池executor.shutdown();}/*** 数据处理任务类,实现了Runnable接口。*/static class DataProcessor implements Runnable {private final List<Integer> dataList; // 待处理的数据列表private final CountDownLatch latch; // 线程同步的计数器/*** DataProcessor 构造函数。* @param dataList 待处理的数据列表。* @param latch 线程同步的计数器。*/public DataProcessor(List<Integer> dataList, CountDownLatch latch) {this.dataList = dataList;this.latch = latch;}/*** 执行数据处理的方法。*/@Overridepublic void run() {processData(dataList);// 任务完成,计数器减一latch.countDown();System.out.println("当前线程"+ Thread.currentThread().getName() +"完成数据处理");}/*** 示例数据处理方法。* @param sublist 待处理的数据子列表。*/private void processData(List<Integer> sublist) {// 简化处理逻辑,仅打印处理的数据范围System.out.println("线程 " + Thread.currentThread().getName() + " 正在处理数据范围: " + sublist.get(0) + " 到 " + sublist.get(sublist.size() - 1));// 可以在此处添加实际的数据处理逻辑}}
}
Java中,通过`ExecutorService`接口创建的线程池提供了两种主要的方法来提交任务:`submit()`和`execute()`。这两种方法都可以用来执行`Runnable`或`Callable`任务,但它们之间存在一些差异:1. **execute()**- **参数**:接受一个`Runnable`类型的任务。- **返回值**:`void`,也就是说它不返回任何结果。- **异常处理**:它不提供直接获取任务执行时抛出异常的机制。如果任务执行期间抛出了异常,它会被传递给线程池的`uncaughtExceptionHandler`处理,而不是直接暴露给调用者。- **用途**:通常用于不需要关注任务执行结果的场景,或者通过其他方式(如Future、回调等)来处理结果或异常。2. **submit()**- **参数**:可以接受`Runnable`或`Callable`类型的任务。如果传入的是`Callable`,那么`submit()`会返回一个`Future`对象。- **返回值**:对于`Runnable`,返回一个表示任务执行完成的`Future<Void>`;对于`Callable`,返回一个`Future<T>`,其中`T`是`Callable`任务返回的结果类型。- **异常处理**:如果任务执行期间抛出了异常,这个异常会被封装进返回的`Future`对象中,调用者可以通过`Future.get()`方法来获取异常或结果,从而可以更精细地控制异常处理逻辑。- **用途**:适用于需要获取任务执行结果或需要处理任务执行过程中可能抛出异常的场景。`Future`提供了检查任务是否完成、取消任务以及获取结果的方法。**总结**- 如果你不需要关心任务的执行结果,或者任务没有结果需要返回,可以使用`execute()`。
- 如果你需要获得任务的执行结果,或者需要能够取消任务、检查任务状态等高级功能,应该使用`submit()`,尤其是当你提交的是`Callable`任务时。通过`submit()`得到的`Future`对象为你提供了更多的灵活性和控制力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/829455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端HTML5学习1(新增布局,状态,列表,文本,表单控件标签)

前端HTML5学习1&#xff08;新增布局&#xff0c;状态&#xff0c;列表&#xff0c;文本&#xff0c;表单控件标签&#xff09; 新增布局标签新增状态标签新增列表标签新增文本标签新增表单控件属性input新增属性值 新增布局标签 HTML5 引入了许多新的语义化标签&#xff0c;用…

【MySQL】A01、性能优化-参数监控分析

1、参数监控 1.1、MySQL command 查看 mysql>SHOW STATUS; &#xff08;服务器状态变量&#xff0c;运行服务器的统计和状态指标&#xff09; mysql> SHOW VARIABLES;&#xff08;服务器系统变量&#xff0c;实际上使用的变量的值&#xff09; mysql> SHOW STATUS …

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

Linux磁盘管理与文件系统

目录 一.磁盘基础 磁盘结构 二.MBR 磁盘分区结构 三.文件系统类型 XFS文件系统 SWAP&#xff0c;交换文件系统 四.磁盘分区 linux系统添加并使用新硬盘的步骤 五 .创建文件系统 mkfs mkfs命令 挂载、卸载文件系统 挂载文件系统、ISO镜像到指定文件夹 ​编辑umount…

Redis可视化工具RedisInsight

下载地址&#xff1a;RedisInsight - The Best Redis GUIRedisInsight provides an intuitive and efficient graphical interface for Redis, allowing you to interact with your databases and manage your data.https://redis.com/redis-enterprise/redis-insight/#insight…

IDEA上配置Maven环境

1.选择IDEA中的Setting 2.搜索maven 3.设置IDEA使用本地安装的Maven&#xff0c;并修改配置文件路径 配置文件&#xff0c;本地仓库&#xff0c;阿里云仓库配置及路径教程 在IDEA上配置完成。

【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口代码

【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口控制代码 文章目录 【Linux内核驱动基础】从零开始手搓一个从上层应用到底层驱动的IO口控制代码一、驱动基础认知1.为什么要学会写驱动2.文件名与设备号3.open函数从上层打通到底层硬件的详细过程 二、基于内核…

【强训笔记】day4

NO.1 思路&#xff1a;利用滚动数组&#xff0c;迭代一个Fibonacci数列&#xff0c;给出三个值进行循环迭代&#xff0c;当n<c时&#xff0c;说明n在b和c之间&#xff0c;这里只需要返回c-n和n-b的最小值就可以了。 代码实现&#xff1a; #include<iostream>using n…

打印给定数组中每一个数字

如何给定1-10的数字 #include<stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,10 };// 0 9//[]--下标引用操作符int i;int sz sizeof(arr) / sizeof(arr[0]);//10个数for (i 0; i < sz; i){printf("%d ", arr[i]);}re…

centos7使用源码安装方式redis

安装编译源码的工具gcc yum install -y gcc下载源码 源码下载地址 https://download.redis.io/releases/ 注意事项 不建议安装最新版本redis&#xff0c;所以我这里选择6.2.6版本 下载 wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压 tar -zxvf redis-…

单片机通讯协议

参考&#xff1a;江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili IIC通讯协议SPI通信协议UARTCANUSB速度100k-400khz4Mhz-线数2 CLK,DATA4CLK,ENB,IO,OI额外设备一主多从一主多从 一般不用自己写&#xff0c;都有相应的库或官方提供相应的&#…

舌头分割YOLOV8-SEG

舌头分割&#xff0c;基于YOLOV8-SEG&#xff0c;训练得到PT模型&#xff0c;然后转换成ONNX&#xff0c;OPENCV的DNN调用&#xff0c;从而摆脱YOLO依赖&#xff0c;支持C,PYTHON,ANDROID开发 舌头分割YOLOV8-SEG

使用预训练模型构建自己的深度学习模型(迁移学习)

在深度学习的实际应用中&#xff0c;很少会去从头训练一个网络&#xff0c;尤其是当没有大量数据的时候。即便拥有大量数据&#xff0c;从头训练一个网络也很耗时&#xff0c;因为在大数据集上所构建的网络通常模型参数量很大&#xff0c;训练成本大。所以在构建深度学习应用时…

OS对软件的管理,进程,PCB、子进程

进程 可执行程序加载到内存中&#xff0c;操作系统为内个程序都形成一个PCB对象&#xff08;结构体对象&#xff09;&#xff0c;PCB里存放着这个程序的所有的属性。进程可执行程序PCB &#xff0c;CPU执行程序也是先通过该程序的PCB找到相应的程序代码&#xff0c;然后一条一…

ThinkPHP5 SQL注入漏洞敏感信息泄露漏洞

1 漏洞介绍 ThinkPHP是在中国使用极为广泛的PHP开发框架。在其版本5.0&#xff08;<5.1.23&#xff09;中,开启debug模式&#xff0c;传入的某参数在绑定编译指令的时候又没有安全处理&#xff0c;预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式&#xff0c…

分享一些实用的工具

1、amCharts5&#xff1a;模拟航线飞行/业务分布图/k线/数据分析/地图等 网址&#xff1a; JavaScript mapping library: amCharts 5https://www.amcharts.com/javascript-maps/ Demo地址&#xff1a;Chart Demos - amChartshttps://www.amcharts.com/demos/#maps 他分为amC…

小龙虾优化算法(Crayfish Optimization Algorithm,COA)

小龙虾优化算法&#xff08;Crayfish Optimization Algorithm&#xff0c;COA&#xff09; 前言一、小龙虾优化算法的实现1.初始化阶段2.定义温度和小龙虾的觅食量3.避暑阶段&#xff08;探索阶段&#xff09;4.竞争阶段&#xff08;开发阶段&#xff09;5.觅食阶段&#xff08…

【誉天战报】3月HCIE战报火热来袭!新增45位同学通过认证!

2024年3月&#xff0c;誉天教育共有45名学员顺利通过了HCIE认证&#xff0c;其中&#xff1a;云计算20人、数通18人、存储5人、云服务2人。让我们一起祝贺他们吧~ 誉天教育是华为优选级授权培训合作伙伴&#xff0c;专业从事华为授权认证课程实战技能培训。连续13年荣获“华为优…

和林曦老师一起读书吧 | 愿我们:只生欢喜不生愁

今天&#xff0c;想和你一起来读书&#xff0c;林曦老师的《只生欢喜不生愁》。    这本书的名字很有意味&#xff0c;它来自于清代《养真集》中的一句话&#xff1a;自古神仙无别法&#xff0c;只生欢喜不生愁。      我们会羡慕这样的状态&#xff1a;只生欢喜不生愁…