[英]Parallel stream doesn't look like working in parallel, completely
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秒內完成。 是蟲子嗎?
我的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.