Java 如何通过传递新线程作为要执行的参数来实现executor服务?

Java 如何通过传递新线程作为要执行的参数来实现executor服务?,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我需要重构一段代码,看看它是否能帮助我解决“无法打开Hibernate会话进行事务处理”的问题。我目前正在尝试简化代码中处理线程的方式 现有代码如下所示。我们称之为“代码A”: if (!CollectionUtils.isEmpty(dailyReportProjectList)) { for (ProjectEntity project : dailyReportProjectList) { Thread.sleep(2000)

我需要重构一段代码,看看它是否能帮助我解决“无法打开Hibernate会话进行事务处理”的问题。我目前正在尝试简化代码中处理线程的方式

现有代码如下所示。我们称之为“代码A”:

    if (!CollectionUtils.isEmpty(dailyReportProjectList)) {
            for (ProjectEntity project : dailyReportProjectList) {
                Thread.sleep(2000);
                new Thread(() -> {
                    try {
                        // Implementation Logic

                        if (isConfig == true) {
                            // Generating Daily Report
                        
                            if (dailyRep != null) {
                                LOG.info(
                                        "============start of daily report mail for zone : " + zone + ", newZone : "
                                                + newZone + " for date : " + currOrPrevDay + "===============");
                                new Thread(() -> {
                                    try {
                                        //genericController;
                                        
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                        
                                        }
                                    }
                                }).start();
                            }
                        } else {
                                 //"All 4 default reports for site : " + project.getId() + ", empId:" + project.getEmployerId());
                            
                                }
                            }
                        }
                        LOG.info("End of generateReportByZone >> zone : " + zone);
                    } catch (Exception e2) {
                        e2.printStackTrace();
                        }
                    }
                }).start();
            }
        }
        
为了简化这一点,我决定继续执行服务。我参考了一些示例,但对使用service.submit()或service.execute()感到困惑。 我看不到以下代码对我的预期好处。你能帮我找出这个方法有什么问题吗

编辑:根据评论,我简化了现有代码,如上所述。有一条线叫做“线内”,我觉得这条线没有多大成就。有这样的实现可以吗

我计划做以下工作:

  • 不要将线程作为for循环中的参数传递,而是创建一个单独的类并使其实现runnable

      public class ReportProcessor implements Runnable {
      private int id;
      public ReportProcessor (int id){
       this.id = id;
       }
    
       public void run(){
       try {
      String currOrPrevDay = new String();
      ...// write the code in the try element of 'code A' here onwards
    
            ExecutorService service = Executors.newFixedThreadPool(3);
    
            for (int i = 0; i < 10; i++) {
                final int number = i;
                service.execute(() -> System.out.println("test" + number));
            }
    
  • 在“代码A”执行器中。提交新创建的类

                 for (i = 0; i < dailyReportProjectList.length; i ++){
             service.submit(new ReportProcessor(i));
    
             }
    
    for(i=0;i

  • 但是,如果我将逻辑分离到一个新类,那么如何满足现有声明的“代码A”所要求的依赖关系呢。我试图在本教程的基础上对executor服务进行建模

    不要传递线程、传递lambda或任何“可运行”的东西


    流自行管理线程。

    您的线程太大,很难阅读。首先,通过几个简单而有意义的调用来重构这个怪物。嗨,马克,我一定会尝试这样做,但是你能帮我确认一下以这种方式调用线程是正确的吗。如果需要,我将用虚拟值简化代码。将示例代码剥离到绝对最小值,以解决您的特定技术问题。不要像这样将线程传递给执行器。传入的线程被视为可运行线程,而实际的OS线程未被使用。这是在浪费资源。executor服务的全部要点是它根据需要为您创建线程。相反,您应该将可调用或可运行的内容传递给executor。嗨,marc,根据您的输入,我正在尝试进行更改,我在问题中编辑了这些内容。请你参考一下。
    dailyReportProjectList.parallelStream()
        .filter(condition)
        .forEach(doSomething)