Java8并行流中自定義線程池操作示例
本文實例講述了Java8并行流中自定義線程池操作。分享給大家供大家參考,具體如下:
1.概覽
java8引入了流的概念,流是作為一種對數(shù)據(jù)執(zhí)行大量操作的有效方式。并行流可以被包含于支持并發(fā)的環(huán)境中。這些流可以提高執(zhí)行性能-以犧牲多線程的開銷為代價
在這篇短文中,我們將看一下 Stream API的最大限制,同時看一下如何讓并行流和線程池實例(ThreadPool instance)一起工作。
2.并行流Parallel Stream
我們先以一個簡單的例子來開始-在任一個Collection類型上調(diào)用parallelStream
方法-它將返回一個可能的并行流。
@Test publicvoidgivenList_whenCallingParallelStream_shouldBeParallelStream(){ List aList = newArrayList<>(); Stream parallelStream = aList.parallelStream(); assertTrue(parallelStream.isParallel()); }
這樣的流的默認(rèn)處理流程是使用ForkJoinPool.commonPool()
,這是一個被整個應(yīng)用程序所共享的線程池。
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的構(gòu)造方法并設(shè)定并行級別為4去創(chuàng)建一個線程池。要想確定不同環(huán)境的最優(yōu)值(optimal),我們需要試驗一下。一個好的做法就是,基于你CPU的核數(shù)來確定并行級別的數(shù)值。
4.總結(jié)
我們簡要地看了一下,如何使用一個自定義的Thread Pool運行并行流。只要在正確的環(huán)境中配置了合適的平行級別,就能在確定的情況下獲得較高的執(zhí)行性能。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
解決Mybatis中mapper.xml文件update,delete及insert返回值問題
這篇文章主要介紹了解決Mybatis中mapper.xml文件update,delete及insert返回值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11springmvc fastjson 反序列化時間格式化方法(推薦)
下面小編就為大家?guī)硪黄猻pringmvc fastjson 反序列化時間格式化方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04synchronized及JUC顯式locks?使用原理解析
這篇文章主要為大家介紹了synchronized及JUC顯式locks?使用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12SpringMVC中的HttpServletRequestWrapper使用解析
這篇文章主要介紹了SpringMVC中的HttpServletRequestWrapper使用解析,HttpServletRequestWrapper 采用裝飾者模式對HttpServletRequest進行包裝,我們可以通過繼承HttpServletRequestWrapper類去重寫getParameterValues,getParameter等方法,需要的朋友可以參考下2024-01-01基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Java設(shè)計一個高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下2023-10-10SpringCloud Eureka服務(wù)發(fā)現(xiàn)實現(xiàn)過程
這篇文章主要介紹了SpringCloud Eureka服務(wù)發(fā)現(xiàn)實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11