【问题标题】:Java EJB @Asynchronous loop - How to know when all the calls are complete before moving on?Java EJB @Asynchronous循环 - 如何在继续之前知道所有调用何时完成?
【发布时间】:2011-09-01 19:04:43
【问题描述】:

我在 ejb 中有这段代码

for (PayrollEntry pe : payroll.getEntries()) {
    recalculatePayrollEntry(pe);
}

CalculateTotals(payroll);

调用这个异步方法

@Asynchronous
public void recalculatePayrollEntry(PayrollEntry pe) {
    // Calculate Payroll Entry;
    pe.setEarningsEntries(newEarnings);
}

在调用 CalcuateTotals 之前等待所有这些重新计算执行的最佳方法是什么?

【问题讨论】:

  • 只是一个评论,如果你等待所有作业完成,你可能不会获得异步处理的任何优势......特别是如果你有一个同步点(如数据库中的某一行)所有作业必须同步。
  • 这些计算中的每一个都需要一段时间,而且它们只使用一个核心。由于它们都不相互依赖,因此我希望能够使用多个内核同时处理它们。

标签: java asynchronous concurrency glassfish ejb


【解决方案1】:

不要将异步方法设为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);

【讨论】:

    【解决方案2】:

    我相信您可以让您的方法返回一个AsyncResult,即Future。方法的返回类型应该是Future

    收集列表中的所有期货,然后在每个期货上调用.get()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 2017-11-25
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多