亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

2json / 3520人閱讀

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

1. 概述 1.1 簡介

并行流就是把一個內(nèi)容分成多個數(shù)據(jù)塊,并用不同的線程分別處理每個數(shù)據(jù)塊的流

Java 8 中將并行進行了優(yōu)化,我們可以很容易的對數(shù)據(jù)進行并行操作,Stream API 可以聲明性地通過 parallel()sequential() 在并行流與順序流之間進行切換。

1.2 了解 Fork/Join 框架

Fork/Join 框架就是在必要的情況下,將一個大任務(wù),進行拆分(fork)成若干個小任務(wù)(拆到不可再拆是),再將一個個的小任務(wù)運算的結(jié)果進行 join 匯總

1.3 Fork/Join 框架與傳統(tǒng)線程池的區(qū)別

采用“工作竊取”模式(work-stealing) : 當(dāng)執(zhí)行新的任務(wù)時它可以將其拆分分成更小的任務(wù)執(zhí)行,并將小任務(wù)加到線程隊列中,然后再從一個隨機線程的隊列中偷一個并把它放在自己的隊列中。

相對于一般的線程池實現(xiàn),F(xiàn)ork/Join 框架的優(yōu)勢體現(xiàn)在對其中包含的任務(wù)的處理方式上。在一般的線程池中,如果一個線程正在執(zhí)行的任務(wù)由于某些原因無法繼續(xù)運行,那么該線程會處于等待狀態(tài)。而在 Fork/Join 框架實現(xiàn)中,如果某個子問題由于等待另外一個子問題的完成而無法繼續(xù)運行。那么處理該子問題的線程會主動尋找其他尚未運行的子問題來執(zhí)行。這種方式減少了線程的等待時間,提高了性能。

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(); //拆分,并將該子任務(wù)壓入線程隊列

            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));
}
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之并行流與串行流
作者:凌風(fēng)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72754.html

相關(guān)文章

  • 樂字節(jié)-Java8特性Stream(上)

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

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

    摘要:陳楊一流的定義流支持串行并行聚合操作元素序列二流的創(chuàng)建流的創(chuàng)建以方法生成流三 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表達(dá)式(一) 雜談

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

    Harpsichord1207 評論0 收藏0
  • 引入

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

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

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

    yacheng 評論0 收藏0

發(fā)表評論

0條評論

2json

|高級講師

TA的文章

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