Callable运行时Asynch回调

时间:2017-02-28 10:19:40

标签: java callback callable

假设我有一个Person对象:

public class Person {
  private String name;
  private History history;
}

历史需要很长时间才能生成,所以我创建了一个 实现Callable的HistoryCallable类,以异步方式生成历史记录:

public class HistoryCallable implements Callable<HistoryResult> {

  @Override
  public HistoryResult call() {
   // do a lot of stuff
  }

现在让我说我有一个人员列表,我想为每个人生成历史记录。我创建了一个HistoryCallable列表,并将每个提交给ExecutorService:

ExecutorService execService =  Executors.newFixedThreadPool();
List<Future<HistoryResult>> results = new ArrayList<>();

for (final Callable<HistoryResult> historyCallable : historyCallables) {
  final Future<HistoryResult> future = execService.submit(historyCallable);
  results.add(mixingThread);
}

我的问题是:这些HistoryCallable实例对它们所属的人一无所知。但是,由于它们需要很长时间才能完成,我需要知道每个人的每个人如何前进,他们处于什么阶段等等。

无论如何我可以使用回调(或其他), 当每个Callable完成时,而不是每个Callable运行时,让我知道进度对于每个人,没有将任何人员信息传递给每个Callable?

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样:

public class HistoryCallable implements Callable<HistoryResult> {


  private long totalItems;
  private volatile long itemsProcessed;

  @Override
  public HistoryResult call() {
   // do a lot of stuff
   // after each item:
   itemsProcessed++;
  }

  public long getItemsProcessed() {
    return itemsProcessed;
  }

  public long getTotalItems() {
    return totalItems;
  }
}



public class PersonHistoryBuilder {
  private Person person;
  private HistoryCallable callable;

  public Person getPerson() {
    return person;
  }

  public float getProgressPercent() {
    return (100.0f * callable.getItemsProcessed()) / callable.getTotalItems();
  }

}