国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 8 新特性之并行流與串行流

2json / 3478人閱讀

摘要:概述簡介并行流就是把一個內容分成多個數據塊,并用不同的線程分別處理每個數據塊的流中將并行進行了優化,我們可以很容易的對數據進行并行操作,可以聲明性地通過與在并行流與順序流之間進行切換。

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();
    ForkJoinTask task = new ForkJoinCalculate(0L, 100000000L);

    long sum = pool.invoke(task);
    System.out.println(sum);

    long end = System.currentTimeMillis();

    System.out.println("耗費的時間為: " + (end - start));
}
3. Java 8 使用并行流

其實 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特性Stream(上)

    摘要:需要注意的是很多流操作本身就會返回一個流,所以多個操作可以直接連接起來,如下圖這樣,操作可以進行鏈式調用,并且并行流還可以實現數據流并行處理操作。為集合創建并行流。 上一篇文章,小樂給大家介紹了《Java8新特性之方法引用》,下面接下來小樂將會給大家介紹Java8新特性之Stream,稱之為流,本篇文章為上半部分。 1、什么是流? Java Se中對于流的操作有輸入輸出IO流,而Jav...

    dingda 評論0 收藏0
  • StreamLambda表達式(五) Stream BaseStream AutoClose

    摘要:陳楊一流的定義流支持串行并行聚合操作元素序列二流的創建流的創建以方法生成流三 package com.java.design.java8.Stream.StreamDetail; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframe...

    HitenDev 評論0 收藏0
  • StreamLambda表達式(一) 雜談

    摘要:一流轉換為數組集合陳楊將流轉換為數組將流轉換為數組將流轉換為集合將流轉換為集合解析 一、流 轉換為數組、集合 package com.java.design.java8.Stream; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context...

    Harpsichord1207 評論0 收藏0
  • 引入

    摘要:流的使用一般包括三件事一個數據源來執行一個查詢一個中間操作鏈,形成一條流水線一個終端操作,執行流水線并生成結果以上便是流的一些基礎知識,下一章會更加深入理解流。實戰第四章引入流讀書筆記歡迎加入咖啡館的春天。 流是什么 幾乎每個 Java 應用都會制造和處理集合。流 允許我們以聲明性方式處理集合(通過類似于 SQL 查詢語句來表達,而不是臨時寫一個實現)。此外 流 還可以透明地并行處理,...

    phodal 評論0 收藏0
  • Java8(stream)操作

    摘要:串行與并行可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執行。返回串行流返回并行流和方法返回的都是類型的對象,說明它們在功能的使用上是沒差別的。唯一的差別就是單線程和多線程的執行。 Stream是什么 Stream是Java8中新加入的api,更準確的說: Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注于對集合對象進行各種非常便...

    yacheng 評論0 收藏0

發表評論

0條評論

2json

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<