Java 8 为什么每次跑步的结果不同?

Java 8 为什么每次跑步的结果不同?,java-8,java-stream,Java 8,Java Stream,我在Java8中使用CompletableFuture和streams,每次运行它时都会得到不同的打印输出。只是好奇,为什么 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=

我在Java8中使用CompletableFuture和streams,每次运行它时都会得到不同的打印输出。只是好奇,为什么

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();
}
}
公共类DoIt{
公共静态类{
专用长电流=0;
公共长廊(下){
返回cur++;
}
}
公共静态长添加(){
长和=0;
for(long i=0;i CompletableFuture.supplyAsync(()->add(),exec))。
mapToLong(f->getResult(f)).sum();
系统输出打印项数(总和);
exec.shutdown();
}
}
如果我跳过f.complete(42l)调用,我总是得到相同的结果

complete(42l)
调用发生时,一些
add()
可能已经完成。


complete(42l)
调用发生时,一些
add()
可能已经完成了。

好的,错过了那一行。谢谢@用户2685400如果这个答案对你有帮助,请接受它。这就是堆栈溢出的工作原理。走一趟:好吧,错过了那一行。谢谢@用户2685400如果这个答案对你有帮助,请接受它。这就是堆栈溢出的工作原理。游览:@guido,请搜索现有标签,而不是创建新标签。我们已经有了一个标签来覆盖Java8流API。@Charles抱歉Charles,我确实搜索了一个,但不希望看到Java前缀,谢谢编辑。我现在也找到了streams ap I(看起来拼写错误),我将继续搜索meta@guido,请搜索现有标记,而不是创建新标记。我们已经有了一个标签来覆盖Java8流API。@Charles抱歉Charles,我确实搜索了一个,但不希望看到Java前缀,谢谢编辑。我现在也找到了streams ap I(看起来拼写错误),我将在meta上搜索