5 java concurrency asynchronous ejb glassfish
我在ejb中有这个代码
for (PayrollEntry pe : payroll.getEntries()) {
recalculatePayrollEntry(pe);
}
CalculateTotals(payroll);
Run Code Online (Sandbox Code Playgroud)
它调用这个异步方法
@Asynchronous
public void recalculatePayrollEntry(PayrollEntry pe) {
// Calculate Payroll Entry;
pe.setEarningsEntries(newEarnings);
}
Run Code Online (Sandbox Code Playgroud)
在调用CalcuateTotals之前等待所有重新计算执行的最佳方法是什么?
gus*_*afc 19
而不是使用async方法void,返回Future(表示异步计算).启动工作,收集所有期货,然后等待完成:
Future<?> recalculatePayrollEntry(PayrollEntry pe) {
// Calculate Payroll Entry;
pe.setEarningsEntries(newEarnings);
return new AsyncResult<Object>(null); // just something symbolic
}
// Usage:
List<Future<?>> results = new ArrayList<>();
for (PayrollEntry pe : payroll.getEntries()) {
results.add(recalculatePayrollEntry(pe));
}
for (Future<?> result : results){
result.get(); // await completion
}
CalculateTotals(payroll);
Run Code Online (Sandbox Code Playgroud)