簡體   English   中英

並行流看起來並不像完全並行工作

[英]Parallel stream doesn't look like working in parallel, completely

1. Set的parallelStream沒有使用足夠的線程。

Java8 parallelStream無法完全並行工作。 在我的計算機中,當任務計數小於處理器計數時,java8集的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的響應之一緩慢時,這看起來很危險。

這是正確的嗎?

parallelStream的合同說:

返回與此集合為源的可能並行的Stream。 此方法允許返回順序流。

如果要並行調用多個任務,請使用ExecutorService

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM