成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

2json / 3486人閱讀

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

1. 概述 1.1 簡(jiǎn)介

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

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

1.2 了解 Fork/Join 框架

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

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

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

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

2. Fork/Join 使用

這里我們的需求是對(duì) 0 到一億進(jìn)行累加操作,下面是 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ù)壓入線程隊(duì)列

            ForkJoinCalculate right = new ForkJoinCalculate(middle + 1, end);
            right.fork();

            return left.join() + right.join();
        }
    }
}

測(cè)試方法

@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("耗費(fèi)的時(shí)間為: " + (end - start));
}
3. Java 8 使用并行流

其實(shí) Java 8 的并行流底層使用的就是 Fork/Join 框架,但是它幫我們簡(jiǎn)化了操作

@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("耗費(fèi)的時(shí)間為: " + (end - start));
}
本文首發(fā)于凌風(fēng)博客:Java 8 新特性之并行流與串行流
作者:凌風(fēng)

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72754.html

相關(guān)文章

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

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

    dingda 評(píng)論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 評(píng)論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 評(píng)論0 收藏0
  • 引入

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

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

    摘要:串行與并行可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執(zhí)行。返回串行流返回并行流和方法返回的都是類型的對(duì)象,說(shuō)明它們?cè)诠δ艿氖褂蒙鲜菦](méi)差別的。唯一的差別就是單線程和多線程的執(zhí)行。 Stream是什么 Stream是Java8中新加入的api,更準(zhǔn)確的說(shuō): Java 8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便...

    yacheng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<