Java EJB @Asynchronous循环 - 如何在继续之前知道所有调用何时完成?

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)