我需要重构代码,看看它是否可以帮助我解决“无法打开 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 的线程,我觉得它没有取得多大成就。这样的实现可以吗?
我计划执行以下操作:
不要将线程作为 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
在“代码 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/