Java - Java 8 parallelStream 和自己创建线程的区别

Java - Difference between Java 8 parallelStream and creating threads ourselves

我试图找出使用 Java 8 的 parallelStream(方法 1)和创建并行线程(方法 2)

之间的区别

我测量了使用方法一和方法二所用的时间,但发现偏差很大。方法 2(~700 毫秒)比方法 1(~20 秒)快得多

方法一:(列表大约有 100 个条目)

list.parallelStream()
    .forEach(ele -> {
        //Do something.
    }));

方法二:

for(i = 0;i < 100; i++) {
    Runnable task = () -> {
     //Do something.
    }
    Thread thread = new Thread(task);
    thread.start();
}

注意:做某事是一项昂贵的操作,例如访问数据库。

我向两者添加了 System.out.println() 消息。我发现方法 1(parallelStream) 似乎 是按顺序执行的,而在方法 2 中消息打印速度非常快。

任何人都可以解释发生了什么。

Can anyone explain what is happening.

很可能你做错了什么,但不清楚是什么。

for (int i = 0; i < 3; i++) {
    long start = System.currentTimeMillis();
    IntStream.range(0, 100).parallel()
            .forEach(ele -> {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ignored) {
                }
            });
    long time = System.currentTimeMillis() - start;
    System.out.printf("Took %,d ms to perform 100 tasks of 100 ms on %d processors%n",
            time, Runtime.getRuntime().availableProcessors());
}

打印

Took 475 ms to perform 100 tasks of 100 ms on 32 processors
Took 401 ms to perform 100 tasks of 100 ms on 32 processors
Took 401 ms to perform 100 tasks of 100 ms on 32 processors