Java8并行流中自定義線程池操作示例
本文實(shí)例講述了Java8并行流中自定義線程池操作。分享給大家供大家參考,具體如下:
1.概覽
java8引入了流的概念,流是作為一種對(duì)數(shù)據(jù)執(zhí)行大量操作的有效方式。并行流可以被包含于支持并發(fā)的環(huán)境中。這些流可以提高執(zhí)行性能-以犧牲多線程的開(kāi)銷為代價(jià)
在這篇短文中,我們將看一下 Stream API的最大限制,同時(shí)看一下如何讓并行流和線程池實(shí)例(ThreadPool instance)一起工作。
2.并行流Parallel Stream
我們先以一個(gè)簡(jiǎn)單的例子來(lái)開(kāi)始-在任一個(gè)Collection類型上調(diào)用parallelStream方法-它將返回一個(gè)可能的并行流。
@Test
publicvoidgivenList_whenCallingParallelStream_shouldBeParallelStream(){
List aList = newArrayList<>();
Stream parallelStream = aList.parallelStream();
assertTrue(parallelStream.isParallel());
}
這樣的流的默認(rèn)處理流程是使用ForkJoinPool.commonPool(),這是一個(gè)被整個(gè)應(yīng)用程序所共享的線程池。
3.自定義線程池
在處理流的時(shí)候,我們可以傳遞自定義一個(gè)線程池。下面的例子中,我們有一個(gè)并行流,這個(gè)并行流使用了一個(gè)自定義的線程池去計(jì)算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è)定并行級(jí)別為4去創(chuàng)建一個(gè)線程池。要想確定不同環(huán)境的最優(yōu)值(optimal),我們需要試驗(yàn)一下。一個(gè)好的做法就是,基于你CPU的核數(shù)來(lái)確定并行級(jí)別的數(shù)值。
4.總結(jié)
我們簡(jiǎn)要地看了一下,如何使用一個(gè)自定義的Thread Pool運(yùn)行并行流。只要在正確的環(huán)境中配置了合適的平行級(jí)別,就能在確定的情況下獲得較高的執(zhí)行性能。
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java進(jìn)程與線程操作技巧總結(jié)》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄
這篇文章主要介紹了Java如何實(shí)現(xiàn)上傳文件到服務(wù)器指定目錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
jmeter實(shí)現(xiàn)接口關(guān)聯(lián)的兩種方式(正則表達(dá)式提取器和json提取器)
Jmeter用于接口測(cè)試時(shí),后一個(gè)接口經(jīng)常需要用到前一次接口返回的結(jié)果,本文主要介紹了jmeter實(shí)現(xiàn)接口關(guān)聯(lián)的兩種方式,感興趣的小伙伴們可以參考一下2021-11-11
Springboot熱加載JAR包的實(shí)現(xiàn)方法
SpringBoot作為一個(gè)開(kāi)發(fā)快速、部署方便的微服務(wù)框架,具有自動(dòng)配置、約定優(yōu)于配置的特點(diǎn),能夠極大地提高開(kāi)發(fā)效率,它提供了豐富的擴(kuò)展點(diǎn),非常適合實(shí)現(xiàn)動(dòng)態(tài)加載Jar包的功能,本文將深入探討如何在SpringBoot應(yīng)用中實(shí)現(xiàn)動(dòng)態(tài)加載Jar包的方案,感興趣的朋友一起看看吧2024-04-04
Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序
這篇文章主要介紹了Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
JAVA(MAVEN項(xiàng)目)添加JUnit依賴配置全過(guò)程
在Maven項(xiàng)目中進(jìn)行單元測(cè)試是確保代碼質(zhì)量的重要步驟,本教程提供SpringBoot和微服務(wù)平臺(tái)適用的單元測(cè)試方法,包括環(huán)境準(zhǔn)備、創(chuàng)建測(cè)試類、JUnit簡(jiǎn)介及注解使用,環(huán)境準(zhǔn)備涉及引入依賴和安裝JUnit插件,測(cè)試類創(chuàng)建可通過(guò)快捷鍵或手動(dòng)添加@Test注解來(lái)實(shí)現(xiàn)2024-10-10
SpringBoot實(shí)現(xiàn)JWT動(dòng)態(tài)密鑰輪換的示例詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)JWT動(dòng)態(tài)密鑰輪換的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流
這篇文章主要為大家介紹了Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
總結(jié)Java集合類操作優(yōu)化經(jīng)驗(yàn)
本文主要介紹的就是集合框架的使用經(jīng)驗(yàn),告訴大家如何高效、方便地管理對(duì)象,所有代碼基于JDK7,需要的朋友可以參考下2015-08-08

