多线程模版案例(可提供平常学习、业务使用)

本文提供了一个关于多线程的实战案例,涉及到ExecutorService、FixedThreadPool的使用,以及AtomicLong和Java8 Stream流的应用。案例中包含了详细的注释,适合学习和业务场景参考。
摘要由CSDN通过智能技术生成

1、相关内容关键字(不熟悉的可自行学习,Java8Stram流的可以替换为for循环)
       ExecutorService、 FixedThreadPool
       CountDownLatch(可暂时不关注)
       AtomicLong
      Java8 Stream流

 

2、案例如下(已加入详细备注):

public static void main(String[] args) throws InterruptedException {
        // 目前有需要处理1000w个数据
        List<String> list = new ArrayList<>();
        IntStream.range(0, 10000000).boxed()
                .forEach(i -> list.add(String.valueOf(i)));

        // 每次最大处理个数是10w个
        int maxHandle = 100000;

        // 计算出需要处理的总次数
        int handleTotal = (list.size() + maxHandle - 1) / maxHandle;

        long start = System.currentTimeMillis();

        // 开启 (需处理总次数的)线程池
        ExecutorService executorService = Executors.newFixedThreadPool(handleTotal);
        // 用于使主线程等待所有线程都已结束(根据业务需求决定)
        CountDownLatch downLatch = new CountDownLatch(handleTotal);

        AtomicLong a = new AtomicLong(0);

        // 使用Java8 进行分页开线程,处理数据
        IntStream.range(0, handleTotal)
                .boxed()
                .forEach(index -> {
//                            long start0 = System.currentTimeMillis();
                            executorService.submit(() -> {
                                list.stream().skip(index * maxHandle).limit(maxHandle).forEach(i -> {
                                    long result = Long.valueOf(i) % 2;
                                    a.addAndGet(result);
                                });
//                                System.err.println("{第" + (index + 1) + "个线程}||耗时:" + (System.currentTimeMillis() - start0) + "ms,index=" + index * maxHandle);
                                // 用于使主线程等待所有线程都已结束(根据业务需求决定)
                                downLatch.countDown();
                            });
                        }
                );
        // 用于使主线程等待所有线程都已结束(根据业务需求决定)
        downLatch.await();
        // 关闭线程服务
        executorService.shutdown();
        System.err.println("{总耗时:}" + (System.currentTimeMillis() - start) + "ms,结果:" + a.get());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值