java 将运行任务的类传递给Completable Future SupplyAsync

x6h2sr28  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(101)

尝试比较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值实现可调用

cbeh67ev

cbeh67ev1#

CompletableFuture.supplyAsync()需要一个Supplier,它相当于ExecutorServiceCallable
目前的做法是,提供一个Supplier,它创建一个Callable,但当然没有调用CallableGetSiteMeterTariffValues)。
您只需要让GetSiteMeterTariffValues实现Supplier,然后直接在CompletableFuture.supplyAsync()中使用它:

CompletableFuture.supplyAsync(
    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)

请注意,Supplier不允许掷回检查的例外状况,所以您不能只使用Callable.call()的方法指涉。

相关问题