尝试比较future和completed future的实现,并检查可完成future的非阻塞特性是否是解决我的问题的更好的用例。让我的可完成实现正确工作有问题。
Collection<Future<ArrayList<MeterTariffValues>>> futures = new ArrayList<>();
List<CompletableFuture<GetSiteMeterTariffValues>> completableFutures = new ArrayList<>();
for (Site site : sites) {
completableFutures.add(
CompletableFuture.supplyAsync(new Supplier<GetSiteMeterTariffValues>() {
@Override
public GetSiteMeterTariffValues get() {
return new GetSiteMeterTariffValues(
site.getSite_id(),
methaneConversionVal,
nitrogenConversionVal,
bu_id,
region_id,
facility_id,
status,
resource_id,
metertype_id,
currentCalendarYear,
currentFiscalYear,
fiscalYearStartMonth,
dates,
meterMapper,
sqlSessionTemplate);
}
}, taskExecutor)
);
futures.add(
taskExecutor.submit(
new GetSiteMeterTariffValues(
site.getSite_id(),
methaneConversionVal,
nitrogenConversionVal,
bu_id,
region_id,
facility_id,
status,
resource_id,
metertype_id,
currentCalendarYear,
currentFiscalYear,
fiscalYearStartMonth,
dates,
meterMapper,
sqlSessionTemplate)));
}
Completable实现的问题在于,它无法识别GetSiteMeterTariffValues在任务完成后返回不同的类型。
它返回
public ArrayList<MeterTariffValues> call()
但任务执行者对此没有意见
for (Future<ArrayList<MeterTariffValues>> future : futures) {
long start = System.currentTimeMillis();
ArrayList<MeterTariffValues> siteMeterTariffMonthlyValues = future.get();
long end = System.currentTimeMillis();
long totalMS = end - start;
total += totalMS;
meterTariffValues.addAll(siteMeterTariffMonthlyValues);
}
所以我想知道我如何可以做类似的上面与completablefutures。
注意:GetSiteMeterTariff值实现可调用
1条答案
按热度按时间cbeh67ev1#
CompletableFuture.supplyAsync()
需要一个Supplier
,它相当于ExecutorService
的Callable
。目前的做法是,提供一个
Supplier
,它创建一个Callable
,但当然没有调用Callable
(GetSiteMeterTariffValues
)。您只需要让
GetSiteMeterTariffValues
实现Supplier
,然后直接在CompletableFuture.supplyAsync()
中使用它:请注意,
Supplier
不允许掷回检查的例外状况,所以您不能只使用Callable.call()
的方法指涉。