Java 如何通过传递新线程作为要执行的参数来实现executor服务?
我需要重构一段代码,看看它是否能帮助我解决“无法打开Hibernate会话进行事务处理”的问题。我目前正在尝试简化代码中处理线程的方式 现有代码如下所示。我们称之为“代码A”:Java 如何通过传递新线程作为要执行的参数来实现executor服务?,java,multithreading,threadpool,executorservice,Java,Multithreading,Threadpool,Executorservice,我需要重构一段代码,看看它是否能帮助我解决“无法打开Hibernate会话进行事务处理”的问题。我目前正在尝试简化代码中处理线程的方式 现有代码如下所示。我们称之为“代码A”: if (!CollectionUtils.isEmpty(dailyReportProjectList)) { for (ProjectEntity project : dailyReportProjectList) { Thread.sleep(2000)
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()感到困惑。
我看不到以下代码对我的预期好处。你能帮我找出这个方法有什么问题吗
编辑:根据评论,我简化了现有代码,如上所述。有一条线叫做“线内”,我觉得这条线没有多大成就。有这样的实现可以吗
我计划做以下工作:
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));
}
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)