Java之parallelStream和stream

1、parallelStream是线程不安全的多线程并发操作

可以通过代码验证如下

googel的guava框架

       <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

package com.example.demo.util;


import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import java.util.List;
import java.util.Map;

public class StreamTest {

    public static void main(String[] args) {

        //线程安全的map
        Map<String, String> one2 = Maps.newConcurrentMap();
        Map<String, String> two2 = Maps.newConcurrentMap();
        for (int i = 0; i < 1000; i++) {
            one2.put(i + "", i + "");
        }
        System.out.println("第一个集合的元素数:" + one2.size());
        // 多线程并发操作 线程安全map
        one2.entrySet().parallelStream().forEach(j->{
            two2.put(j.getKey(),j.getValue());
        });
        System.out.println("第二个集合的元素数:" + two2.size());//

        //线程不安全的map
        Map<String, String> one = Maps.newHashMap();
        Map<String, String> two = Maps.newHashMap();
        for (int i = 0; i < 1000; i++) {
            one.put(i + "", i + "");
        }
        System.out.println("第一个集合的元素数:" + one.size());
        // 多线程并发操作 线程不安全map
        one.entrySet().parallelStream().forEach(j->{
            two.put(j.getKey(),j.getValue());
        });
        System.out.println("第二个集合的元素数:" + two.size());//

        //线程不安全的map
        Map<String, String> one1 = Maps.newHashMap();
        Map<String, String> two1 = Maps.newHashMap();
        for (int i = 0; i < 1000; i++) {
            one1.put(i + "", i + "");
        }
        System.out.println("第一个集合的元素数:" + one1.size());
        // 单线程安全操作
        one1.entrySet().stream().forEach(j->{
            two1.put(j.getKey(),j.getValue());
        });
        System.out.println("第二个集合的元素数:" + two1.size());//

        //parallelStream 对线程不安全的集合操作
        parallelStreamNotSafe();
//
//        //parallelStream 对线程安全的集合操作
        parallelStreamSafe();
//
//        // stream对线程不安全的集合操作
        streamSafe();
    }

    public static void parallelStreamNotSafe() {
        //创建线程不安全的集合
        List<Integer> one = Lists.newArrayList();
        for (int i = 0; i < 1000; i++) {
            //插入100个数据
            one.add(i);
        }
        System.out.println("第一个集合的元素数:" + one.size());
        //线程不安全的集合
        List<Integer> two = Lists.newArrayList();
        //多线程并发
        one.parallelStream().forEach(e -> {
            //添加list的方法
            two.add(e);
            try {
                //休眠1ms,假装执行某些任务
                Thread.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });
        //第二个集合的元素数会小于1000
        System.out.println("第二个集合的元素数:" + two.size());//
    }

    public static void parallelStreamSafe() {
        //创建线程安全的集合
        List<Integer> one = Lists.newCopyOnWriteArrayList();
        for (int i = 0; i < 1000; i++) {
            //插入100个数据
            one.add(i);
        }
        System.out.println("第一个集合的元素数:" + one.size());
        //线程安全的集合
        List<Integer> two = Lists.newCopyOnWriteArrayList();
        //多线程并发
        one.parallelStream().forEach(e -> {
            //添加list的方法
            two.add(e);
            try {
                //休眠1ms,假装执行某些任务
                Thread.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });
        //第二个集合的元素数等于 1000
        System.out.println("第二个集合的元素数:" + two.size());
    }


    public static void streamSafe() {
        //创建线程不安全的集合
        List<Integer> one = Lists.newArrayList();
        for (int i = 0; i < 1000; i++) {
            //插入100个数据
            one.add(i);
        }
        System.out.println("第一个集合的元素数:" + one.size());
        //线程不安全的集合
        List<Integer> two = Lists.newArrayList();
        //单线程
        one.stream().forEach(e -> {
            //添加list的方法
            two.add(e);
            try {
                //休眠1ms,假装执行某些任务
                Thread.sleep(1);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        });
        //第二个集合的元素数等于 1000
        System.out.println("第二个集合的元素数:" + two.size());
    }
}

guava创建线程不安全的集合代码如下

 Map<String, String> one = Maps.newHashMap();
 List<Integer> one = Lists.newArrayList();

guava创建线程安全的集合代码如下

 List<Integer> one = Lists.newCopyOnWriteArrayList();
 Map<String, String> one2 = Maps.newConcurrentMap();

线程安全操作

        List<User> users = Lists.newArrayList();
        for (int i = 0; i < 1000; i++) {
            User user = User.builder().id(i)
                    .deptId(1).build();
            users.add(user);
        }
        //线程安全操作
        List<Integer> userId = users.parallelStream().map(i->i.getId()).collect(Collectors.toList());
        Map<Integer,User> map = users.parallelStream().collect(Collectors.toMap(i->i.getId(),i->i));
        Integer collect = users.parallelStream().collect(Collectors.summingInt(User::getDeptId));
        System.out.println(userId.size());
        System.out.println(map.size());
        System.out.println(collect);

stream的groupby操作

      List<User> users = Lists.newArrayList();
        for (int i = 0; i < 100; i++) {
            User user = User.builder()
                    .deptId(i)
                    .id(i)
                    .name("xxx" + i).build();
            if (i % 3 == 0) {
                user.setType("t1");
            } else if (i % 3 == 1) {
                user.setType("t2");
            } else {
                user.setType("t3");
            }
            users.add(user);
        }

        Map<String, Long> typeMap = users.parallelStream().collect(Collectors.groupingBy(User::getType, Collectors.counting()));
        System.out.println(typeMap.size());
Map<Long, List<PatrolPoint>> groupProjectMap = patrolPoints.parallelStream()
        .collect(Collectors.groupingBy(u -> u.getDutyId()));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非ban必选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值