package com.test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;
/**
* @param <H> 为被处理的数据类型
* @param <T>返回数据类型
*/
public abstract class MultiThread<H,T>{
private final ExecutorService exec; //线程池
private final BlockingQueue<Future<T>> queue = new LinkedBlockingQueue<>();
private final CountDownLatch startLock = new CountDownLatch(1); //启动门,当所有线程就绪时调用countDown
private final CountDownLatch endLock; //结束门
private final List<H> listData;//被处理的数据
/**
* @param list list.size()为多少个线程处理,list里面的H为被处理的数据
*/
public MultiThread(List<H> list){
if(list!=null&&list.size()>0){
this.listData = list;
exec = Executors.newFixedThreadPool(list.size()); //创建线程池,线程池共有nThread个线程
endLock = new CountDownLatch(list.size()); //设置结束门计数器,当一个线程结束时调用countDown
}else{
listData = null;
exec = null;
endLock = null;
}
}
/**
*
* @return 获取每个线程处理结速的数组
* @throws InterruptedException
* @throws ExecutionException
*/
public List<T> getResult() throws InterruptedException, ExecutionException{
List<T> resultList = new ArrayList<>();
if(listData!=null&&listData.size()>0){
int nThread = listData.size(); //线程数量
for(int i = 0; i < nThread; i++){
H data = listData.get(i);
Future<T> future = exec.submit(new Task(i,data){
@Override
public T execute(int currentThread,H data) {
return outExecute(currentThread,data);
}
}); //将任务提交到线程池
queue.add(future); //将Future实例添加至队列
}
startLock.countDown(); //所有任务添加完毕,启动门计数器减1,这时计数器为0,所有添加的任务开始执行
endLock.await(); //主线程阻塞,直到所有线程执行完成
for(Future<T> future : queue) {
resultList.add(future.get());
}
exec.shutdown(); //关闭线程池
}
return resultList;
}
/**
* 每一个线程执行的功能,需要调用者来实现
* @param currentThread 线程号
* @param data 每个线程被处理的数据
* @return T返回对象
*/
public abstract T outExecute(int currentThread,H data);
/**
* 线程类
*/
private abstract class Task implements Callable<T>{
private int currentThread;//当前线程号
private H data;
public Task(int currentThread,H data){
this.currentThread=currentThread;
this.data=data;
}
@Override
public T call() throws Exception {
startLock.await(); //线程启动后调用await,当前线程阻塞,只有启动门计数器为0时当前线程才会往下执行
T t =null;
try{
t = execute(currentThread,data);
}finally{
endLock.countDown(); //线程执行完毕,结束门计数器减1
}
return t;
}
/**
* 每一个线程执行的功能
* @param currentThread 线程号
* @param data 每个线程被处理的数据
* @return T返回对象
*/
public abstract T execute(int currentThread,H data);
}
}
多线程并行执行,汇总结果


在IT行业中,多线程并行执行是一种常见的优化策略,特别是在处理大数据量或者需要高性能计算的任务时。"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率和响应速度。 **多线程并行执行** 多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责不同的任务,以实现任务的并发执行。这种技术可以充分利用多核处理器的优势,将CPU的计算能力最大化,从而提高程序的运行效率。在Java中,可以通过创建`Thread`对象并调用其`start()`方法来启动一个新线程。 **CountDownLatch** `CountDownLatch`是Java并发包(java.util.concurrent)中的一个计数器类,它允许一个或多个线程等待其他线程完成操作。在初始化时,`CountDownLatch`需要一个非负整数作为计数器的初始值。每次调用`countDown()`方法时,计数值会减1,当计数值为0时,所有等待的线程会被释放,可以继续执行。这对于实现多线程之间的同步非常有用,确保所有线程都完成任务后,再进行下一步操作。 例如,在一个多线程并行执行的任务中,可能需要所有线程都执行完毕后才汇总结果。这时,可以设置一个`CountDownLatch`,初始化计数值为线程的数量,每个线程执行完后调用`countDown()`,最后主线程通过调用`await()`方法等待计数值变为0,即所有线程执行完毕,然后进行结果的汇总。 **汇总结果** 在多线程环境下,汇总结果通常涉及到线程安全的数据结构和同步机制。Java提供了多种线程安全的集合,如`ConcurrentHashMap`、`AtomicInteger`等,它们在多线程环境下能够保证数据的一致性和完整性。线程可以在执行过程中将计算结果放入这些线程安全的数据结构,而无需担心数据竞争的问题。 例如,每个线程可以使用`AtomicInteger`累加计算结果,当所有线程执行完后,主线程可以通过读取`AtomicInteger`的值来获取汇总的结果。或者,使用`ConcurrentHashMap`存储每个线程的局部结果,最后主线程遍历`ConcurrentHashMap`进行合并,得到最终的汇总结果。 **文件名列表:code** 在提供的压缩包中,"code"可能是包含示例代码的文件。这些代码可能展示了如何使用`Thread`和`CountDownLatch`来实现多线程并行执行,并在所有线程完成后汇总结果。具体代码实现可能包括创建`Thread`对象、初始化`CountDownLatch`、线程的`run()`方法以及主线程的等待和汇总逻辑。 多线程并行执行是提升程序性能的重要手段,而`CountDownLatch`和线程安全的数据结构则为在多线程环境中控制执行顺序和保证数据一致性提供了有力支持。理解并熟练运用这些工具和技术,对于开发高效、可靠的并发应用程序至关重要。


























- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 91
- 资源: 19
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 好用的shell工具,FinalShell
- [Windows Server 2016系统管理与网络管理]唐华[电子课件PPT]
- 《Flash CS6动画制作(第3版)》PPT课件
- 《Java 程序设计基础》PPT
- 无人驾驶领域中基于视觉与深度学习的开源项目汇总及应用
- 《Java 程序设计基础》代码
- 一个完全用 c# 开发,小巧可用的 PS1 模拟器
- 《虚拟现实应用开发教程(高级)》-电子教案-教学指南
- (Intel芯片)苹果电脑Mac下最好用的反编译三件套,包括apktool、dex2jar、jd-gui
- 适用于华为笔记本MateBook D(2017款)的电脑管家
- 无感电机控制中高频注入与DQ轴位置估算的全开源代码及其实现
- 《虚拟现实应用开发教程(中级)》-电子教案-教学指南
- mobaxterm 下载、安装、使用
- 3D打印制造PPT课件
- 3D打印制造-电子教案-教学指南
- Altium Designer 14原理图与PCB设计教程PPT


