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

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

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

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

Stream

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

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

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

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

ParallelStream

對于ParallelStream,需要知道的是里面的執(zhí)行是異步的,并且使用的線程池是ForkJoinPool.common,可以通過設置-Djava.util.concurrent.ForkJoinPool.common.parallelism = N來調整線程池的大?。?/p>

ParallelStream的作用

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

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

得到的展示順序不一定會是1、2、3、4、5、6、7、8、9,而可能是任意的順序。得到的結論就是parallelStream()每次執(zhí)行的結果都不相同,與多線程程序中執(zhí)行的結果類似。如果希望最后順序是按照原來Stream的數(shù)據(jù)順序,那可以調用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í)行,提高程序運行效率。但是如果使用不當可能會發(fā)生線程安全的問題。

其他同類知識點:

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

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

parallelStream與stream效率比較

結論

parallel線程不安全

parallel的效率,因為是多線程,默認線程數(shù)量是計算器處理器的數(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);
    }
    /**
     * 構造數(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;
    }
}

測試截圖

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

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

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

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

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

相關文章

  • Spring使用注解更簡單的讀取和存儲對象的方法

    Spring使用注解更簡單的讀取和存儲對象的方法

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

    Spring-Retry(重試機制)解讀

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

    springboot項目打包成jar包的圖文教程

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

    java日期處理工具類

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

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

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

    idea更改默認緩存位置的步驟詳解

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

    java使用DelayQueue實現(xiàn)延時任務

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

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

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

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

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

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

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

最新評論

西和县| 商水县| 天水市| 泊头市| 耒阳市| 乌鲁木齐县| 扶沟县| 光山县| 齐齐哈尔市| 汉沽区| 阳泉市| 唐山市| 皮山县| 安徽省| 芜湖县| 乌恰县| 南召县| 东港市| 静宁县| 肃南| 图们市| 永清县| 涪陵区| 桐城市| 姚安县| 鄂伦春自治旗| 遂平县| 改则县| 洪泽县| 北流市| 邛崃市| 云林县| 稻城县| 德令哈市| 临湘市| 云林县| 彩票| 芦溪县| 象州县| 石门县| 霍城县|