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 …

NDK 基础(二)—— C++ 语言基础与特性1

1、C 语言基础 本节主要还是了解一些 C 的基本用法以及与 C 语言的不同/改进之处。比如说&#xff0c;C 是面向对象的语言&#xff0c;C 是面向过程的语言。 1.1 Hello, C 熟悉 C 的标准 IO 库、命名空间以及基本的输入输出方法&#xff1a; // 导入 C 的标准输入输出库 #i…

Chapter 1-16. Introduction to Congestion in Storage Networks

Lack of Buffers for the Distance, Frame Size, and Speed of a Link In lossless networks, the required number of buffers on a port increase as the length of its link increases, the speed increases and the average frame size decreases. 在无损网络中,随着链路…

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…

【软考】I/O与主机信息传送的控制方式

目录 一、说明二、程序查询方式三、程序中断方式四、DMA方式五、例题5.1 例题1 一、说明 1.I/O设备与主机交换信息时&#xff0c;共有5种控制方式&#xff1a;程序查询方式、程序中断方式、直接存储器存取方式&#xff08;DMA&#xff09;、I/O通道方式、I/O处理机方式。 二、…

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;都有相应的库或官方提供相应的&#…

密码学系列2-安全模型(CPA,CCA,selective,adaptive)

本章介绍了安全模型中的CPA,selective/adaptive CCA, EUF-CMA 加密的安全性模型定义: 一、选择明文攻击下的不可区分性(IND-CPA) 初始化:挑战者 C \mathcal{C} C运行初始化算法算法来获取系统参数。 阶段1:敌手 A \mathcal{A} A产生明文,加密的

舌头分割YOLOV8-SEG

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

5367: 【图论】奇点数

题目描述 美术老师生病了&#xff0c;今天美术课编程老师来上&#xff0c;给大家一张无向图&#xff0c;包含 n个顶点&#xff08;编号1∼n&#xff09;&#xff0c;m条边&#xff0c;求这张图中的奇点数。 偶点(even vertex)&#xff1a;度数为偶数的顶点称为偶点 奇点(odd…

casa学习代码记录

标题 casa是专门用于处理VLA望远镜的集成软件&#xff0c;相应的教程对于干涉阵处理来说可谓是非常详细&#xff0c;甚至对于其他干涉阵的pipline来说&#xff0c;一些参数的意义甚至可以参考回来casa教程的的说明&#xff1a;以下记录一下相关的代码和主要的流程&#xff1a;…

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

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