重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
本文實例講述了Java8并行流中自定義線程池操作。分享給大家供大家參考,具體如下:
創新互聯公司專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站制作、成都網站設計、外貿營銷網站建設、婺城網絡推廣、成都微信小程序、婺城網絡營銷、婺城企業策劃、婺城品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創新互聯公司為所有大學生創業者提供婺城建站搭建服務,24小時服務熱線:13518219792,官方網址:www.cdcxhl.com
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程序設計有所幫助。