本文實例講述了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程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。