首页 > 解决方案 > 并行流看起来不像完全并行工作

问题描述

1、Set的parallelStream没有使用足够的线程。

Java8 parallelStream 不能完全并行工作。在我的计算机中,当任务的计数小于处理器的计数时,java8 set 的 parallelStream 没有使用足够的线程。

public class ParallelStreamSplitTest {
    @Test
    public void setStreamParallelTest() {
        System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
        long start = System.currentTimeMillis();
        IntStream.range(1, 8).boxed().collect(Collectors.toCollection(HashSet::new)).parallelStream().forEach((index) -> {
            System.out.println("Starting " + Thread.currentThread().getName() + ",    index=" + index + ", " + new Date());
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
        });
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
    }

    @Test
    public void intStreamParallelTest() {
        System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
        long start = System.currentTimeMillis();
        IntStream.range(1, 8).parallel().forEach(index -> {
            System.out.println("Starting " + Thread.currentThread().getName() + ",    index=" + index + ", " + new Date());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        });
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
    }
}

在我的代码中,setStreamParallelTest 需要 4 秒,而 intStreamParallelTest 需要 1 秒。

我希望 setStreamParallelTest 也能在 1 秒内完成。是虫子吗?

2. web应用程序中可以使用并行流调用另一个api吗?如果是错的,为什么?

我的 Web 应用程序需要并行调用另一个 api 服务器。所以我使用并行流来调用api。

Sets.newHashSet(api1, api2, api3, api4).parallelStream().forEach(api -> callApiSync(api))

我认为所有发往我的服务器的请求都共享一个 fork-join 池。所以,当其中一个 api 的响应很慢时,它看起来很危险。

这是对的吗?

标签: javajava-stream

解决方案


合同parallelStream说:

返回以该集合为源的可能并行 Stream。此方法允许返回顺序流。

如果要并行调用多个任务,请使用ExecutorService.


推荐阅读