假设我有一个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?
答案 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();
}
}