使用ExecutorService在通过循环传递不同参数的类中并发执行方法的问题

时间:2019-05-06 16:22:49

标签: java multithreading parallel-processing executorservice

我正在尝试编写一个程序来处理大量员工(约一百万)的操作。我正在使用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

   }

}

请建议通过代码或更有效的替代方式进行纠正

1 个答案:

答案 0 :(得分:2)

有多种方法可以解决此问题。

两种常见方法是:

  • CountDownLatch
  • ExecutorService.invokeAll

您可以使用CountDownLatch

  

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


您可以使用ExecutorService中的方法invokeAll

  

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