51

私はCompletableFutureコードで以下に示すように使用しています。しかし、すべてのランナブルが終了するまで待つ方法については、2 つの方法を見つけましたが、それらの違いがわかりません。どちらがベスト プラクティスですか? それらは次のとおりです。

コード:

this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedNERun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);
this.growSeedFutureList = CompletableFuture.runAsync(new GrowSeedSWRun(this.saliencyMat, this.seedXY, this.seedVal), this.growSeedExecutor);

すべてのランナブルが終了するまで待機する最初のアプローチ:

this.growSeedExecutor.shutdown();
this.growSeedExecutor.awaitTermination(1, TimeUnit.DAYS);

すべてのランナブルが終了するまで待機する 2 番目のアプローチ:

CompletableFuture.allOf(this.growSeedFutureList).join();

どちらがオススメか教えてください。

4

3 に答える 3

0

返信が少し遅れましたが、このコードが探している人に役立つことを願っています. これは、共通の forkJoin プール エグゼキューターを使用します。

package com.company;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;

public class CompletableFutureExample {
    public static void main(String args[]){
        List<CompletableFuture> futureList=new ArrayList<>();
        for(int i=0;i<10;i++) {
            futureList.add(CompletableFuture.supplyAsync(()->getThreadName()).thenAccept(name->printThreadName(name)));
        }
        futureList.forEach(CompletableFuture::join);
    }

    static String getThreadName(){
        String threadDetails=Thread.currentThread().getName();
        System.out.println("thread deteails::::"+threadDetails);
        return threadDetails;
    }
    static void printThreadName(String value){
        System.out.println("thread string value::"+value);
    }
}
于 2022-01-01T14:33:41.960 に答える