1

Java 8 で CompletableFuture とストリームをいじっていますが、これを実行するたびに異なる出力が得られます。ただ興味があります、なぜですか?

public class DoIt {
public static class My {
    private long cur = 0;
    public long next() {
        return cur++;
    }
}
public static long add() {
    long sum = 0;
    for (long i=0; i<=100;i++) {
        sum += i;
    }
    return sum;
}

public static long getResult(CompletableFuture<Long> f) {
    long l = 0;
    try {
        f.complete(42l);
        l = f.get();
        System.out.println(l);
    } catch (Exception e) {
        //...
    }
    return l;
}
public static void main(String[] args){
    ExecutorService exec = Executors.newFixedThreadPool(2);
    My my = new My();
    long sum = Stream.generate(my::next).limit(20000).
    map(x -> CompletableFuture.supplyAsync(()-> add(), exec)).
    mapToLong(f->getResult(f)).sum();
    System.out.println(sum);
    exec.shutdown();
}
}

f.complete(42l) 呼び出しをスキップすると、常に同じ結果が得られます。

4

1 に答える 1