溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8并行流中自定義線程池操作示例

發布時間:2020-09-03 20:28:25 來源:腳本之家 閱讀:265 作者:lyuharvey 欄目:編程語言

本文實例講述了Java8并行流中自定義線程池操作。分享給大家供大家參考,具體如下:

1.概覽

java8引入了流的概念,流是作為一種對數據執行大量操作的有效方式。并行流可以被包含于支持并發的環境中。這些流可以提高執行性能-以犧牲多線程的開銷為代價

在這篇短文中,我們將看一下 Stream API的最大限制,同時看一下如何讓并行流和線程池實例(ThreadPool instance)一起工作。

2.并行流Parallel Stream

我們先以一個簡單的例子來開始-在任一個Collection類型上調用parallelStream方法-它將返回一個可能的并行流。

@Test
publicvoidgivenList_whenCallingParallelStream_shouldBeParallelStream(){
  List aList = newArrayList<>();
  Stream parallelStream = aList.parallelStream();
  assertTrue(parallelStream.isParallel());
}

這樣的流的默認處理流程是使用ForkJoinPool.commonPool(),這是一個被整個應用程序所共享的線程池。

3.自定義線程池

在處理流的時候,我們可以傳遞自定義一個線程池。下面的例子中,我們有一個并行流,這個并行流使用了一個自定義的線程池去計算1到 1,000,000的和:

@Testpublic void giveRangeOfLongs_whenSummedInParallel_shouldBeEqualToExpectedTotal() throws InterruptedException, ExecutionException { long firstNum = 1; long lastNum = 1_000_000; List aList = LongStream.rangeClosed(firstNum, lastNum).boxed()
   .collect(Collectors.toList());
  ForkJoinPool customThreadPool = new ForkJoinPool(4);
  long actualTotal = customThreadPool.submit(
   () -> aList.parallelStream().reduce(0L, Long::sum)).get();
  assertEquals((lastNum + firstNum) * lastNum / 2, actualTotal);
}

我們使用ForkJoinPool的構造方法并設定并行級別為4去創建一個線程池。要想確定不同環境的最優值(optimal),我們需要試驗一下。一個好的做法就是,基于你CPU的核數來確定并行級別的數值。

4.總結

我們簡要地看了一下,如何使用一個自定義的Thread Pool運行并行流。只要在正確的環境中配置了合適的平行級別,就能在確定的情況下獲得較高的執行性能。

更多java相關內容感興趣的讀者可查看本站專題:《Java進程與線程操作技巧總結》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》

希望本文所述對大家java程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女