我正在尝试编写一个程序来处理大量员工(约一百万)的操作。我正在使用ExecutorService并行化操作以在池大小为1000的员工循环中创建线程。 (我有24核(48逻辑核)的Intel cpu和128GB的ram服务器)。我的操作包括许多数据库访问,这就是为什么我使用的线程池大小为1000。
我的目标是处理对员工的操作,而主线程应等待所有其他线程完成作业,然后返回处理结果。 问题是主线程立即创建线程后返回。
Servlet代码:
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
}
}
请建议通过代码或更有效的替代方式进行纠正
答案 0 :(得分:2)
有多种方法可以解决此问题。
两种常见方法是:
您可以使用CountDownLatch
:
一种同步帮助,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。
您可以使用ExecutorService
中的方法invokeAll
:
执行给定的任务,当所有任务完成时,返回保存其状态和结果的期货列表。 Future.isDone()对于返回列表的每个元素为true。请注意,已完成的任务可能已正常终止,也可能引发异常。如果在进行此操作时修改了给定的集合,则该方法的结果不确定。