java - 如何通过传递新线程作为参数来执行执行器服务?

标签 java multithreading threadpool executorservice

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

现有代码如下所示。我们称之为“代码 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() 感到困惑。 我没有从下面的代码中看到我想要的好处。您能帮我找出此方法的任何问题吗?

编辑:根据评论,我简化了现有代码,如上所述。有一个名为 inside the thread 的线程,我觉得它没有取得多大成就。这样的实现可以吗?

我计划执行以下操作:

  1. 不要将线程作为 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
    
  2. 在“代码 A”执行器中。提交新创建的类<​​/p>

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

但是,如果我将逻辑分离到一个新类中,如何满足现有规定的“代码 A”所需的依赖关系。我正在尝试根据本教程https://www.youtube.com/watch?v=KUdro0G1BV4&t=325s对我的执行器服务进行建模

最佳答案

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

        ExecutorService service = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 10; i++) {
            final int number = i;
            service.execute(() -> System.out.println("test" + number));
        }

编辑:
我真的认为这段代码需要简单。您似乎想要创建报告。
那么为什么要在线程中创建线程呢?
为什么是 Thread.sleep ? (通常是不当行为,更喜欢等待/通知)

我确实认为你根本不需要线程。
但如果你真的想要(或需要)它们,松散耦合:

  • 每个线程都会执行一项精确的任务。
  • 决定做什么的测试必须在上游进行。

并尝试 Streams 和函数式接口(interface)。它将简化您的代码。

dailyReportProjectList.parallelStream()
    .filter(condition)
    .forEach(doSomething)

流本身管理线程。

关于java - 如何通过传递新线程作为参数来执行执行器服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65739455/

相关文章:

java - SQLite 与 netbeans 不工作

jakarta-ee - Glassfish 设置并发批处理作业的最大数量

java - Servlet 无法从数据库中提取值

java - 如何使用prometheus java客户端监控请求和响应之间的时间跨度

java - 在 Java 中声明嵌套类

python - time.sleep 与 threading.Lock 的交互

python - 如何将循环应用于 python 中的多线程

没有happens-before关系的Java多线程

c# - Java 自适应线程池的设计注意事项

java - 使用不同的唯一 id 提高每个线程的性能