摘要:概述簡介并行流就是把一個內容分成多個數據塊,并用不同的線程分別處理每個數據塊的流中將并行進行了優化,我們可以很容易的對數據進行并行操作,可以聲明性地通過與在并行流與順序流之間進行切換。
1. 概述 1.1 簡介
并行流就是把一個內容分成多個數據塊,并用不同的線程分別處理每個數據塊的流
Java 8 中將并行進行了優化,我們可以很容易的對數據進行并行操作,Stream API 可以聲明性地通過 parallel() 與 sequential() 在并行流與順序流之間進行切換。
1.2 了解 Fork/Join 框架Fork/Join 框架就是在必要的情況下,將一個大任務,進行拆分(fork)成若干個小任務(拆到不可再拆是),再將一個個的小任務運算的結果進行 join 匯總
1.3 Fork/Join 框架與傳統線程池的區別采用“工作竊取”模式(work-stealing) : 當執行新的任務時它可以將其拆分分成更小的任務執行,并將小任務加到線程隊列中,然后再從一個隨機線程的隊列中偷一個并把它放在自己的隊列中。
相對于一般的線程池實現,Fork/Join 框架的優勢體現在對其中包含的任務的處理方式上。在一般的線程池中,如果一個線程正在執行的任務由于某些原因無法繼續運行,那么該線程會處于等待狀態。而在 Fork/Join 框架實現中,如果某個子問題由于等待另外一個子問題的完成而無法繼續運行。那么處理該子問題的線程會主動尋找其他尚未運行的子問題來執行。這種方式減少了線程的等待時間,提高了性能。
2. Fork/Join 使用這里我們的需求是對 0 到一億進行累加操作,下面是 Fork/Join 的處理方法
public class ForkJoinCalculate extends RecursiveTask{ private long start; private long end; private static final long THRESHOLD = 10000L; //臨界值 public ForkJoinCalculate(long start, long end) { this.start = start; this.end = end; } @Override protected Long compute() { long length = end - start; if (length <= THRESHOLD) { long sum = 0; for (long i = start; i <= end; i++) { sum += i; } return sum; } else { long middle = (start + end) / 2; ForkJoinCalculate left = new ForkJoinCalculate(start, middle); left.fork(); //拆分,并將該子任務壓入線程隊列 ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end); right.fork(); return left.join() + right.join(); } } }
測試方法
@Test public void test1(){ long start = System.currentTimeMillis(); ForkJoinPool pool = new ForkJoinPool(); ForkJoinTask3. Java 8 使用并行流task = new ForkJoinCalculate(0L, 100000000L); long sum = pool.invoke(task); System.out.println(sum); long end = System.currentTimeMillis(); System.out.println("耗費的時間為: " + (end - start)); }
其實 Java 8 的并行流底層使用的就是 Fork/Join 框架,但是它幫我們簡化了操作
@Test public void test3(){ long start = System.currentTimeMillis(); Long sum = LongStream.rangeClosed(0L, 100000000L) .parallel() .sum(); System.out.println(sum); long end = System.currentTimeMillis(); System.out.println("耗費的時間為: " + (end - start)); }
本文首發于凌風博客:Java 8 新特性之并行流與串行流
作者:凌風
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72754.html
摘要:需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。為集合創建并行流。 上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下面接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。 1、什么是流? Java Se中對于流的操作有輸入輸出IO流,而Jav...
摘要:陳楊一流的定義流支持串行并行聚合操作元素序列二流的創建流的創建以方法生成流三 package com.java.design.java8.Stream.StreamDetail; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframe...
摘要:一流轉換為數組集合陳楊將流轉換為數組將流轉換為數組將流轉換為集合將流轉換為集合解析 一、流 轉換為數組、集合 package com.java.design.java8.Stream; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context...
摘要:串行與并行可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執行。返回串行流返回并行流和方法返回的都是類型的對象,說明它們在功能的使用上是沒差別的。唯一的差別就是單線程和多線程的執行。 Stream是什么 Stream是Java8中新加入的api,更準確的說: Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注于對集合對象進行各種非常便...
閱讀 881·2023-04-25 19:17
閱讀 2179·2021-09-10 11:26
閱讀 1898·2019-08-30 15:54
閱讀 3411·2019-08-30 15:53
閱讀 2681·2019-08-30 11:20
閱讀 3392·2019-08-29 15:12
閱讀 1230·2019-08-29 13:16
閱讀 2384·2019-08-26 12:19