3

以下のコードに記載されている「CompletableFuture.runAsync」のそれぞれがいくつかの計算を行い、「CompletableFuture.runAsync」を呼び出すたびに結果を取得したいと考えています。つまり、「future0、future1、future2、future3」のそれぞれに、「CompletableFuture.runAsync」への各呼び出しの結果をそれぞれ含める必要があります

どうやってやるの。

*更新

私の要件は、 CompletableFuture.runAsync への呼び出しごとに、いくつかの計算を行い、これらの値の ArrayList を返す必要があることです。CompletableFuture.runAsync への 4 回の呼び出しの後、返された ArrayLists でさらに計算を行いたいと思います。

コード:

    if (this.laplaceImgList != null) {
                        if (!this.laplaceImgList.isEmpty()) {
                            if (this.laplaceImgList.size() == 3) {
                                //executor
                                ExecutorService orintMapExe;
                                CompletableFuture<Void> future0 = null;
                                CompletableFuture<Void> future1 = null;
                                CompletableFuture<Void> future2 = null;
                                CompletableFuture<Void> future3 = null;

                                orintMapExe = Executors.newFixedThreadPool(1);
                                future0 = CompletableFuture.runAsync(new orintMapRun(SysConsts.ORINT_DEG_ZERO , this.laplaceImgList), orintMapExe);
                                future1 = CompletableFuture.runAsync(new orintMapRun(SysConsts.ORINT_DEG_45 , this.laplaceImgList), orintMapExe);
                                future2 = CompletableFuture.runAsync(new orintMapRun(SysConsts.ORINT_DEG_90 , this.laplaceImgList), orintMapExe);
                                future2 = CompletableFuture.runAsync(new orintMapRun(SysConsts.ORINT_DEG_135 , this.laplaceImgList), orintMapExe);
                                CompletableFuture.allOf(future0,future1,future2,future3).join();//blocks the main thread till future0, and future1 finishes
4

2 に答える 2

5

ここでは、ジョブが a を返し、指定したFuture値のリストを取得する例を投稿しています。あなたが結果を期待するように(実際にはリスト)、実装しCallableます。

public class OrintMapRun implements Callable<List<Integer>> {
    final int partOne, partTwo;
    final List<Integer> resultList = new ArrayList<>();
    public OrintMapRun(int partOne, int partTwo) {
        this.partOne = partOne;
        this.partTwo = partTwo;
    }

    @Override
    public List<Integer> call() throws Exception {
        resultList.add(partOne);
        resultList.add(partTwo);
        Thread.sleep(5000); //simulate some computation
        return resultList;
    }
}

Callables次に示すように、それらをエグゼキュータ サービスに送信する必要があります。

public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService orintMapExe = Executors.newFixedThreadPool(4);
        List<Future<List<Integer>>> futures = new ArrayList<>();

        futures.add(orintMapExe.submit(new OrintMapRun(10, 10)));
        futures.add(orintMapExe.submit(new OrintMapRun(20, 20)));
        futures.add(orintMapExe.submit(new OrintMapRun(30, 30)));
        futures.add(orintMapExe.submit(new OrintMapRun(40, 40)));

        orintMapExe.shutdown();
        try {
            orintMapExe.awaitTermination(1, TimeUnit.DAYS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        for(Future<List<Integer>> future : futures) {
            List<Integer> result = future.get();
            System.out.println(result);
        }
    }

すべての先物の結果を取得すると、次のようになります。

[10, 10] [20, 20] [30, 30] [40, 40]

ちなみに、クラス名は常に大文字で始める必要があります。

于 2015-05-08T15:11:30.710 に答える