gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:58:18 25 4
gpt4 key购买 nike

我需要重构代码以查看它是否可以帮助我解决“无法打开 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();
}
}

为了简化这一点,我决定继续使用 Executor Service。我提到了一些例子,我对使用 service.submit() 或 service.execute() 感到困惑。
我没有从下面的代码中看到我想要的好处。你能帮我找出这个方法的任何问题吗?
编辑:根据评论,我已经简化了上面的现有代码。线程内部有一个线程,我觉得没有太大的成就。有这样的实现可以吗?
我打算做以下事情:
  • 不要将线程作为 for 循环中的参数传递,而是创建一个单独的类并让它实现可运行。
      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
  • 在“代码 A”执行程序中。提交新创建的类
                 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 中创建一个线程呢?
    为什么 Thread.sleep ? (通常是渎职,更喜欢等待/通知)
    我真的认为你根本不需要线程。
    但是如果你真的想要(或需要)它们,松散耦合:
  • 每个线程执行一个单一的、精确的任务。
  • 决定做什么的测试必须在上游。

  • 并尝试 Streams 和功能接口(interface)。它将简化您的代码。
    dailyReportProjectList.parallelStream()
    .filter(condition)
    .forEach(doSomething)
    流自己管理线程。

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com