对于Stream.generate(foo).parallel(),foo必须是线程安全的吗?

MyS*_*ver 3 java parallel-processing java-stream

我正在使用Java 8 Streams.我有一个自定义函数,foo()它产生一个对象,我想并行传输它创建的对象.我知道foo()不是线程安全的.

如果我写Stream.generate(foo).parallel(),将以foo()异步方式调用?即,对象是串行生成的,并传递给并行线程,还是多个线程都会根据需要通过调用生成对象foo()

Mis*_*sha 5

如您可以通过快速实验观察到的,将从多个线程调用供应商:

Stream.generate(() -> Thread.currentThread().getId())
    .parallel()
    .limit(100000)
    .distinct()
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

  • 从多个线程被调用并不一定意味着被并发调用。与之比较,例如“ forEachOrdered”,其动作可以从不同的线程调用,但不能同时调用。因此,该测试不足以确定供应商是否必须是线程安全的。(尽管在这种情况下,确实会同时评估供应商,并且必须保证线程安全)。 (2认同)