请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于Accumulator累加器 使用复杂表达式

这是我运行的代码,当不是叠加或者叠乘的时候

public class Test10 {

    public static void main(String[] args) throws InterruptedException {
        LongAccumulator accumulator = new LongAccumulator((x, y) -> {
            long s = x + x * y;
            System.out.println(x + "+" + x + "*" + y + "=" + s);
            return s;
        }, 1);
        ExecutorService executor = Executors.newFixedThreadPool(8);
        IntStream.range(1, 10).forEach(i -> executor.submit(() -> accumulator.accumulate(i)));

        executor.shutdown();
        Thread.sleep(2000);
        System.out.println(accumulator.getThenReset());
    }

}

此时的运行结果:
图片描述

但是当我把表达式写成一行,就可以运行出固定结果

public class Test10 {

    public static void main(String[] args) throws InterruptedException {
        LongAccumulator accumulator = new LongAccumulator((x, y) -> {
            return x + x * y;
        }, 1);
        ExecutorService executor = Executors.newFixedThreadPool(8);
        IntStream.range(1, 10).forEach(i -> executor.submit(() -> accumulator.accumulate(i)));

        executor.shutdown();
        Thread.sleep(1000);
        System.out.println(accumulator.getThenReset());
    }

}

图片描述

所以在方法只写一行运行语句的时候,是会顺序运行吗?

正在回答 回答被采纳积分+3

1回答

提问者 技术进步官 2020-12-18 20:51:17

想明白了,是因为并发操作线程只要保证x和y是当前操作之后x的值不允许改变,只写一行语句的时候,是因为运行速度非常快,所以会有固定的结果出现。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信