2017-08-28 120 views
3
List<Integer> list = Arrays.asList(3, 4, 6, 1, 2, 3, 5, 6); 
list.parallelStream().forEach(System.out::print);   
list.parallelStream().map(a -> a + 2).forEach(a -> System.out.println(Thread.currentThread().getName() + "--" + a)); 

兩三行會用同一個forkjoinpool嗎?如果沒有,如何讓他們使用一個?Java8中的forkjoinpool stream api是單例嗎?

回答

1

所有並行流在由ForkJoinPool.commonPool()返回的單例池中運行。例外情況是,如果您從ForkJoinPool內部運行並行流,則該流將在其調用的池中運行。

這些是在Streams API文檔中沒有指定的實現細節,因此java開發人員完全有權選擇其他池或完全避開fork/join框架並執行其他操作。

如果知道哪些線程最終執行代碼對您至關重要,那麼流式API可能不是您的最佳選擇。

0

目前 - 是的,有對所有默認的並行流單池 - 這是ForkJoinPool#commonPool;因此你的觀察是正確的。

有一種方法可以爲每個執行Stream pipeline設置自定義池,請參閱here

它看起來像這樣你的第二個例子:

List<Integer> list = Arrays.asList(3, 4, 6, 1, 2, 3, 5, 6); 

    ForkJoinPool forkJoinPool = new ForkJoinPool(4); 
    ForkJoinTask<?> task = forkJoinPool.submit(() -> list 
      .parallelStream() 
      .map(a -> a + 2) 
      .forEach(a -> System.out.println(Thread.currentThread().getName() + "--" + a))); 
    task.get();