首页 > 解决方案 > 使用 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

   }

}

请建议更正代码或替代有效的方法

标签: javamultithreadingparallel-processingexecutorservice

解决方案


有不同的方法来解决这个问题。

两种常见的方法是:

  • 倒计时锁存器
  • ExecutorService.invokeAll

您可以使用CountDownLatch

一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。


您可以使用以下方法invokeAllExecutorService

执行给定的任务,返回一个 Futures 列表,在所有完成时保存它们的状态和结果。Future.isDone() 对于返回列表的每个元素都是 true。请注意,已完成的任务可能已经正常终止,也可能通过引发异常终止。如果在此操作进行时修改了给定的集合,则此方法的结果是不确定的。


推荐阅读