java多线程处理list,速度提升嗖嗖的!

这篇具有很好参考价值的文章主要介绍了java多线程处理list,速度提升嗖嗖的!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

项目场景

问题描述

解决方案:

方法一:没有返回值,直接在任务里完成计算

方法二:有返回值

最后


项目场景

前台通过模板批量上传数据到后台


问题描述

后台使用常规方法处理数据,效率低下


解决方案:

使用多线程线程池实现

方法一:没有返回值,直接在任务里完成计算

package com.lwk.test;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample {

    public static void main(String[] args) throws InterruptedException {
        // 创建一个包含 10 个线程的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 创建一个包含 10000 个元素的 List
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10001; i++) {
            list.add(i);
        }

        // 将 List 分成 10 个子 List,每个子 List 包含 1000 个元素
        List<List<Integer>> subLists = new ArrayList<>();
        int subListSize = 1000;
        for (int i = 0; i < list.size(); i += subListSize) {
            subLists.add(list.subList(i, Math.min(i + subListSize, list.size())));
        }

        // 提交每个子 List 的处理任务给线程池
        for (List<Integer> subList : subLists) {
            executorService.submit(new Task(subList));
        }

        // 等待线程池中所有任务执行完毕
        executorService.shutdown();
        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);

        // 打印处理结果
        System.out.println("List size: " + list.size());
        System.out.println("Sum of elements: " + Task.getSum());
    }

    static class Task implements Runnable {
        private List<Integer> list;
        private static long sum = 0;

        public Task(List<Integer> list) {
            this.list = list;
        }

        @Override
        public void run() {
            long subSum = 0;
            for (int i : list) {
                subSum += i;
            }
            synchronized (Task.class) {
                sum += subSum;
            }
        }

        public static long getSum() {
            return sum;
        }
    }
}

方法二:有返回值

除了创建线程池和分割 List 的过程外,主要的变化是将 Task 类改为实现 Callable 接口,并返回子 List 的和。使用 CompletionService 提交任务和获取任务执行结果,从而减少了线程池等待时间提高执行效率。最后,将每个子 List 的和累加起来,打印处理结果。

package com.lwk.test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThreadPoolExample2 {

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个包含 10 个线程的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        // 创建一个 CompletionService,用于提交任务和获取任务执行结果
        CompletionService<Long> completionService = new ExecutorCompletionService<>(executorService);

        // 创建一个包含 10000 个元素的 List
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 10001; i++) {
            list.add(i);
        }

        // 将 List 分成 10 个子 List,每个子 List 包含 1000 个元素
        List<List<Integer>> subLists = new ArrayList<>();
        int subListSize = 1000;
        for (int i = 0; i < list.size(); i += subListSize) {
            subLists.add(list.subList(i, Math.min(i + subListSize, list.size())));
        }

        // 提交每个子 List 的处理任务给 CompletionService
        for (List<Integer> subList : subLists) {
            completionService.submit(new Task(subList));
        }

        // 获取每个任务的执行结果,并将结果累加起来
        long sum = 0;
        for (int i = 0; i < subLists.size(); i++) {
            Future<Long> future = completionService.take();
            sum += future.get();
        }

        // 打印处理结果
        System.out.println("List size: " + list.size());
        System.out.println("Sum of elements: " + sum);

        // 关闭线程池
        executorService.shutdown();
    }

    static class Task implements Callable<Long> {
        private List<Integer> list;

        public Task(List<Integer> list) {
            this.list = list;
        }

        @Override
        public Long call() throws Exception {
            long subSum = 0;
            for (int i : list) {
                subSum += i;
            }
            return subSum;
        }
    }
}

最后

如果改为项目中使用的话,需要将 【创建一个包含 10000 个元素的 List】改为自己的数据集即可!

需要注意的是:在使用线程池时,需要选择合适的线程池大小,以避免创建过多的线程导致系统资源耗尽!

还有一点:也不要盲目的去开多个线程。如果你的服务器是单cpu单核开多线程反而会增加上下文损耗,从而降低程序执行效率。能开多少个线程,理论是这样计算的:逻辑cpu个数 = (物理cpu个数 * 每个cpu的核心数 * 超线程数),命令见如下

1.查看物理cpu个数,也就是实物cpu的个数

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

2.查看每个cpu的core,也就是常说的核心数

cat /proc/cpuinfo| grep "cpu cores"| uniq

今天的分享就到这里了,如果问题欢迎留言指正! 文章来源地址https://www.toymoban.com/news/detail-482943.html

到了这里,关于java多线程处理list,速度提升嗖嗖的!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解放计算力:使用并行处理提升python for循环速度

    Python 是一门功能强大的编程语言,但在处理大规模数据或复杂计算任务时,性能可能成为一个瓶颈。幸运的是,Python 提供了多种方法来提升性能,其中之一是利用并行处理来加速循环操作。本文将介绍如何使用并行处理技术来优化 for 循环,从而提高 Python 程序的执行速度。

    2024年02月10日
    浏览(48)
  • 【Java并发】聊聊Future如何提升商品查询速度

    java中可以通过new thread、实现runnable来进行实现线程。但是唯一的缺点是没有返回值、以及抛出异常,而callable就可以解决这个问题。通过配合使用futuretask来进行使用。 并且Future提供了对任务的操作,取消,查询是否完成,获取结果。 FutureTask核心代码 基本属性 任务 当线程

    2024年01月25日
    浏览(37)
  • python 开启5个线程处理list数据

    你可以使用如下代码来开启5个线程来处理列表数据: 在这个例子中,我们首先将要处理的列表划分成了5个子列表,每个子列表包含5个元素。然后,我们创建5个线程,每个线程分别处理一个子列表。最后,等待所有线程执行完毕。这样可以同时处理多个子列表,在一定程度

    2024年02月12日
    浏览(35)
  • Java提升数据库大数据查询速度的几种方式

    本文章以MySQL数据库为用例说明,列举出几个常用的提升查询速度的方式。 分页查询,在网络浏览中,经常会看到分页的使用,像百度搜索分页、文档资料分页等,这些都是一种常见的提升数据查询速度和用户体验的一种方式,数据库有limit,开发人员可使用此

    2024年02月12日
    浏览(56)
  • Linux下线程池详解与实现:提升多任务处理效率的关键

                                                      🎬慕斯主页 : 修仙—别有洞天                                               ♈️ 今日夜电波: マイノリティ脈絡—ずっと真夜中でいいのに。                                          

    2024年04月14日
    浏览(32)
  • Springboot 多线程分批切割处理 大数据量List集合 ,实用示例

    哲学提问镇贴: 不了解异步怎么使用的看官, 可阅: SpringBoot 最简单的使用异步线程案例 @Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处理操作的看官,可阅:   Java List数据量大, 需要分片

    2024年02月06日
    浏览(53)
  • Java多线程文件下载器高文件下载速度

    在进行大文件下载时,使用多线程技术可以显著提高下载速度。本文将介绍如何使用多线程下载器来实现并行下载,以加快文件下载过程。 多线程下载器是一种利用多线程同时下载文件的工具。它将大文件分割成多个小块,并使用多个线程同时下载这些小块文件。随后,将下

    2024年02月11日
    浏览(36)
  • c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

    总结:视频中对于多线程讲的非常透彻,从线程基础概念—.net不同版本出现的线程方法—多线程常出现问题—双色球项目实践,每个知识点都有代码实操,受益匪浅。附上学习笔记和实操代码。 视频 线程:程序执行的最小单位,任何操作都是由线程完成的,使用同步时,资

    2024年02月11日
    浏览(52)
  • 针对java中list.parallelStream()的多线程数据安全问题我们采用什么方法最好呢?

    当使用List.parallelStream()方法进行多线程处理时,可能会涉及到数据安全问题。下面是一些常见的方法来处理parallelStream()的多线程数据安全问题: 1. 使用线程安全的集合:Java中提供了线程安全的集合类,如CopyOnWriteArrayList和synchronizedList等。可以将原始的List转换为线程安全的集

    2024年02月10日
    浏览(40)
  • Java入门7(异常处理,list集合)

    一般来讲,程序出现错误的时候,大致情况有三种: 语法错误 运行时错误,指的是各程序运行的时候,出现的一些没有想到的问题,比如除数为0,比如数组下标越界等等 逻辑错误,运行结果和与其结果不一致,俗称bug ⭐Java中的异常处理机制主要用于处理运行时错误 ​运行

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包