java - 使用 ExecutorService 在具有通过循环传递的不同参数的类中同时执行方法的问题
问题描述
我正在尝试编写一个程序来处理对大约一百万左右的大量员工的操作。我正在使用 ExecutorService 来并行化操作,以在池大小为 1000 的员工循环中创建线程。(我有 24 个核心(48 个逻辑核心)intel cpu 和 128gb ram 服务器)。我的操作包括许多数据库访问,这就是为什么我使用 1000 的线程池大小。
我的目标是处理员工的操作,而主线程应该等待所有其他线程完成作业,然后返回处理结果。问题是主线程在立即创建线程后返回。
小服务程序代码:
public class EmployeeProcess extends HttpServlet {
protected void doGet(....) {
employeeDAO.executePrepareReport();
}
}
第二类:
public class EmployeeDAOImpl implements EmployeeDAO {
public void executePrepareReport() {
ExecutorService executorService = Executors.newFixedThreadPool(1000);
// method reference introduced in Java 8
for(Employee employee : comp.listOfEmp) {
executorService.submit(new Runnable() {
public void run() {
prepareEmpReport(employee);
}
});
}
executorService.shutdown();
//executorService.awaitTermination();
}
@Override
public void prepareEmpReport(Employee employee) {
// process employee report with database accesses
}
}
请建议更正代码或替代有效的方法
解决方案
有不同的方法来解决这个问题。
两种常见的方法是:
- 倒计时锁存器
- ExecutorService.invokeAll
您可以使用CountDownLatch
:
一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
您可以使用以下方法invokeAll
:ExecutorService
执行给定的任务,返回一个 Futures 列表,在所有完成时保存它们的状态和结果。Future.isDone() 对于返回列表的每个元素都是 true。请注意,已完成的任务可能已经正常终止,也可能通过引发异常终止。如果在此操作进行时修改了给定的集合,则此方法的结果是不确定的。
推荐阅读
- java - 使用图像滑块制作图像轮播
- javascript - 当我迭代这个字段数组时,我遇到了这个错误:TypeError: Cannot read property 'map' of undefined
- android - 捕获系统.err
- angular - 调用删除服务在 Angular 中不起作用
- javascript - 从所选选项中获取文本并将其放入文本框中
- python - 将 xml 包对象附加到 python 字典中
- actionscript-3 - 检测连续触摸的单元格以通过碰撞或位置获胜
- javascript - 将对象数组操作到新数组中
- postgresql - PostgreSQL创建阻止太多更新行的触发器
- node.js - 使用 Node JS 将子目录作为 localhost 与端口 3000 进行隧道连接