最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8的Stream()與ParallelStream()的區(qū)別說(shuō)明

 更新時(shí)間:2021年07月28日 10:11:35   作者:No8g攻城獅  
這篇文章主要介紹了Java8的Stream()與ParallelStream()的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java8 Stream()與ParallelStream()區(qū)別

Stream

無(wú)狀態(tài):指元素的處理不受之前元素的影響;

有狀態(tài):指該操作只有拿到所有元素之后才能繼續(xù)下去。

非短路操作:指必須處理所有元素才能得到最終結(jié)果;

短路操作:指遇到某些符合條件的元素就可以得到最終結(jié)果,如 A || B,只要A為true,則無(wú)需判斷B的結(jié)果。

ParallelStream

對(duì)于ParallelStream,需要知道的是里面的執(zhí)行是異步的,并且使用的線程池是ForkJoinPool.common,可以通過(guò)設(shè)置-Djava.util.concurrent.ForkJoinPool.common.parallelism = N來(lái)調(diào)整線程池的大小;

ParallelStream的作用

Stream具有平行處理能力,處理的過(guò)程會(huì)分而治之,也就是將一個(gè)大任務(wù)切分成多個(gè)小任務(wù),這表示每個(gè)任務(wù)都是一個(gè)操作,因此像以下的程式片段:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
numbers.parallelStream().forEach(System.out::println);

得到的展示順序不一定會(huì)是1、2、3、4、5、6、7、8、9,而可能是任意的順序。得到的結(jié)論就是parallelStream()每次執(zhí)行的結(jié)果都不相同,與多線程程序中執(zhí)行的結(jié)果類似。如果希望最后順序是按照原來(lái)Stream的數(shù)據(jù)順序,那可以調(diào)用forEachOrdered()。

例如:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); 
numbers.parallelStream().forEachOrdered(System.out::println);

你得到的展示順序就是1、2、3、4、5、6、7、8、9。

Java8并行流parallelStream()和stream()的區(qū)別就是支持并行執(zhí)行,提高程序運(yùn)行效率。但是如果使用不當(dāng)可能會(huì)發(fā)生線程安全的問(wèn)題。

其他同類知識(shí)點(diǎn):

1、Java集合Stream類filter的使用;

2、Java中的排序問(wèn)題(Java8新特性 stream流、stream多字段排序);

parallelStream與stream效率比較

結(jié)論

parallel線程不安全

parallel的效率,因?yàn)槭嵌嗑€程,默認(rèn)線程數(shù)量是計(jì)算器處理器的數(shù)量

代碼

public class StreamTest {
    @Test
    public void streamVs(){
        List<Integer> list1 = new ArrayList<>(10000);
        List<Integer> list2 = new ArrayList<>(10000);
        List<Integer> list3 = new ArrayList<>(10000);
        Lock lock = new ReentrantLock();
        IntStream.range(0, 10000).forEach(list1::add);
        IntStream.range(0, 10000).parallel().forEach(list2::add);
        IntStream.range(0, 10000).parallel().forEach(i -> {
            lock.lock();
            try {
                list3.add(i);
            }finally {
                lock.unlock();
            }
        });
        System.out.println("串行執(zhí)行的大小:" + list1.size());
        System.out.println("并行執(zhí)行的大?。? + list2.size());
        System.out.println("加鎖并行執(zhí)行的大?。? + list3.size());
    }
    @Test
    public void streamVs2(){
        List<Person> persons = constructPersons();
        doFor(persons);
        doStream(persons);
        doParallelStream(persons);
    }
    /**
     * 構(gòu)造數(shù)據(jù)
     *
     * @return
     */
    public List<Person> constructPersons() {
        List<Person> persons = new ArrayList<Person>();
        for (int i = 0; i < 5; i++) {
            Person p = new Person(i, "name" + i, "sex" + i, i);
            persons.add(p);
        }
        return persons;
    }
    /**
     * for
     *
     * @param persons
     */
    public void doFor(List<Person> persons) {
        long start = System.currentTimeMillis();
        for (Person p : persons) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            //System.out.println(p.name);
        }
        long end = System.currentTimeMillis();
        System.out.println("doFor cost:" + (end - start));
    }
    /**
     * 順序流
     *
     * @param persons
     */
    public void doStream(List<Person> persons) {
        long start = System.currentTimeMillis();
        persons.stream().forEach(x -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            //System.out.println(x.name);
        });
        long end = System.currentTimeMillis();
        System.out.println("doStream cost:" + (end - start));
    }
    /**
     * 并行流
     *
     * @param persons
     */
    public void doParallelStream(List<Person> persons) {
        long start = System.currentTimeMillis();
        persons.parallelStream().forEach(x -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
            //System.out.println(x.name);
        });
        long end = System.currentTimeMillis();
        System.out.println("doParallelStream cost:" + (end - start));
    }
}
class Person {
    int    id;
    String name;
    String sex;
    float  height;
    public Person(int id, String name, String sex, float height) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.height = height;
    }
}

測(cè)試截圖

串行執(zhí)行的大?。?0000

并行執(zhí)行的大?。?219

加鎖并行執(zhí)行的大?。?0000

doFor cost:5012
doStream cost:5073
doParallelStream cost:2013

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法

    Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法

    這篇文章主要介紹了Spring使用注解更簡(jiǎn)單的讀取和存儲(chǔ)對(duì)象的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-07-07
  • Spring-Retry(重試機(jī)制)解讀

    Spring-Retry(重試機(jī)制)解讀

    這篇文章主要介紹了Spring-Retry(重試機(jī)制),具有很好的價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • springboot項(xiàng)目打包成jar包的圖文教程

    springboot項(xiàng)目打包成jar包的圖文教程

    有時(shí)候我們會(huì)用IDEA來(lái)開(kāi)發(fā)一些小工具,需要打成可運(yùn)行的JAR包,這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目打包成jar包的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • java日期處理工具類

    java日期處理工具類

    這篇文章主要為大家詳細(xì)介紹了java日期處理工具類,其次還介紹了日期處理的基礎(chǔ)知識(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 15個(gè)頂級(jí)Java多線程面試題(附答案)

    15個(gè)頂級(jí)Java多線程面試題(附答案)

    這篇文章主要為大家分享了15個(gè)頂級(jí)Java多線程面試題,考察面試者是否有足夠的Java線程與并發(fā)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • idea更改默認(rèn)緩存位置的步驟詳解

    idea更改默認(rèn)緩存位置的步驟詳解

    在idea使用中,會(huì)產(chǎn)生大量的緩存,一般默認(rèn)存放在C盤里面,會(huì)加大C盤的儲(chǔ)存負(fù)擔(dān),如果C盤足夠大,可以不考慮更改idea的緩存位置,所以本文小編給如何更改idea默認(rèn)緩存位置,文中通過(guò)圖文結(jié)合介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • java使用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)

    java使用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)

    項(xiàng)目中經(jīng)常會(huì)用到類似一些需要延遲執(zhí)行的功能,比如緩存,java提供了DelayQueue來(lái)很輕松的實(shí)現(xiàn)這種功能,下面小編就來(lái)和大家介紹一下如何使用DelayQueue實(shí)現(xiàn)延時(shí)任務(wù)吧
    2023-10-10
  • java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí),1000次插入方法的比較。
    2013-04-04
  • springboot結(jié)合maven實(shí)現(xiàn)多模塊打包

    springboot結(jié)合maven實(shí)現(xiàn)多模塊打包

    本文主要介紹了springboot借助maven完成多模塊打包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 詳解使用@RequestBody取POST方式的json字符串

    詳解使用@RequestBody取POST方式的json字符串

    這篇文章主要介紹了詳解使用@RequestBody取POST方式的json字符串,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

楚雄市| 枣庄市| 福州市| 长垣县| 兴城市| 连南| 东台市| 宝山区| 嵩明县| 特克斯县| 长阳| 滦南县| 河西区| 江孜县| 名山县| 新干县| 营口市| 佛冈县| 徐州市| 东乌| 荥经县| 惠安县| 墨玉县| 渑池县| 河北省| 灵璧县| 连南| 同江市| 兴安盟| 岐山县| 方正县| 祥云县| 买车| 太仓市| 阿坝| 黎川县| 米易县| 比如县| 扬州市| 金溪县| 宜城市|