JAVA多线程处理for循环数据详细讲解

 更新时间:2023年07月28日 11:35:59   作者:二拾三  
这篇文章主要给大家介绍了关于JAVA多线程处理for循环数据的相关资料,我们在代码中经常需要使用for循环这个操作来达到目的,而当for循环的次数过多时我们会发现执行效率会变的很低,整体耗时非常多,需要的朋友可以参考下

1.对for循环内数据启用多线程执行,主线程与子线程无先后顺序

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 5; i++) {
            ThreadUtil.execAsync(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程" + Thread.currentThread().getName() + "执行完");
            });
            System.out.println("第" + i + "个线程");
        }
        System.out.println("完成");
    }

执行结果:

2.对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行

    public static void main(String[] args) throws InterruptedException {
        //初始化线程数量
        CountDownLatch countDownLatch = ThreadUtil.newCountDownLatch(5);
        for (int i = 0; i < 5; i++) {
            ThreadUtil.execute(() -> {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("线程" + Thread.currentThread().getName() + "执行完");
                //调用线程计数器-1
                countDownLatch.countDown();
            });
            System.out.println("第" + i + "个线程");
        }
        //唤醒主线程
        countDownLatch.await();
        System.out.println("完成");
    }

执行结果:

3.对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行

 public static void main(String[] args) throws InterruptedException {
        // 线程个数
        int N = 10;
        // 实例化一个倒计数器,N指定计数个数
        CountDownLatch countDownLatch = new CountDownLatch(N);
        for (int i = 0; i < N; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                        System.out.println("子线程" + Thread.currentThread().getName() + "休眠结束");
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                    	// 计数减一
                        countDownLatch.countDown(); 
                    }
                }
            }).start();
        }
        // 阻塞,等待当计数减到0时,执行后面的代码
        countDownLatch.await();
        System.out.println("结束");
    }

执行结果:

4. JAVA多线程10个线程处理1000个数据

    public static void main(String[] args) throws Exception {
        List<Integer> idList = new ArrayList<>();
        for (int i = 1; i <= 1000; i++) {
            idList.add(i);
        }
        int threadNum = 10;
        ExecutorService executorService = Executors.newFixedThreadPool(threadNum);
        CountDownLatch countDownLatch = new CountDownLatch(threadNum);
        int perSize = idList.size() / threadNum;
        // 定义接受数据集合  多线程情况下,使用线程安全集合
        List<Integer> resultList = Collections.synchronizedList(new ArrayList());
        for (int i = 0; i < threadNum; i++) {
            MultiThread thread = new MultiThread();
            thread.setIdList(idList.subList(i * perSize, (i + 1) * perSize));
            thread.setCountDownLatch(countDownLatch);
            thread.setResultList(resultList);
            executorService.submit(thread);
        }
        countDownLatch.await();
        executorService.shutdown();
        // 查看结果
        System.out.println(resultList.size());
        System.out.println(resultList.stream().sorted().collect(Collectors.toList()));
    }
}
class MultiThread extends Thread {
    private List<Integer> idList;
    private CountDownLatch countDownLatch;
    private List<Integer> result;
    public void setResultList(List<Integer> result) {
        this.result = result;
    }
    public void setIdList(List<Integer> idList) {
        this.idList = idList;
    }
    public void setCountDownLatch(CountDownLatch countDownLatch) {
        this.countDownLatch = countDownLatch;
    }
    @Override
    public void run() {
        try {
            // 数据处理
            for (Integer integer : idList) {
                if (integer % 2 == 0) {
                    result.add(integer);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (countDownLatch != null) {
                countDownLatch.countDown();
            }
        }
    }

执行结果:

总结

到此这篇关于JAVA多线程处理for循环数据的文章就介绍到这了,更多相关JAVA处理for循环数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 2020macOS Big Sur配置Java开发环境之jdk安装过程

    2020macOS Big Sur配置Java开发环境之jdk安装过程

    这篇文章主要介绍了2020macOS Big Sur配置Java开发环境之jdk安装,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Spring使用Jackson实现转换XML与Java对象

    Spring使用Jackson实现转换XML与Java对象

    这篇文章主要为大家详细介绍了Spring如何使用Jackson实现转换XML与Java对象,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • Java实现冒泡排序示例介绍

    Java实现冒泡排序示例介绍

    冒泡排序是一种简单的排序算法,通过不断比较相邻两个元素的大小,将较大的元素向后移动,最终将最大的元素放到了数组的末尾。Java中的实现方式是通过嵌套两层循环,外层循环控制比较的次数,内层循环控制每次比较时相邻元素的比较和交换
    2023-04-04
  • 详解java开发webservice的几种方式

    详解java开发webservice的几种方式

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,有兴趣的可以了解一下。
    2016-11-11
  • 简单谈谈Java垃圾回收

    简单谈谈Java垃圾回收

    本文是看了James Gosling的<<Java程序设计语言>>后结合自己的一些项目经验,简单总结下关于java的垃圾回收问题的看法,有需要的小伙伴可以参考下
    2016-05-05
  • Spring实现处理跨域请求代码详解

    Spring实现处理跨域请求代码详解

    这篇文章主要介绍了Spring实现处理跨域请求代码详解,具有一定借鉴价值,需要的朋友可以了解下。
    2017-12-12
  • 教你怎么用java实现客户端与服务器一问一答

    教你怎么用java实现客户端与服务器一问一答

    这篇文章主要介绍了教你怎么用java实现客户端与服务器一问一答,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java微信公众平台开发(11) 微信三大平台的关联

    Java微信公众平台开发(11) 微信三大平台的关联

    这篇文章主要介绍了Java微信公众平台开发第十一步,微信开发中微信公众平台、开放平台和商户平台的关联,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java 使用Filter实现用户自动登陆

    Java 使用Filter实现用户自动登陆

    这篇文章主要介绍了Java 使用Filter实现用户自动登陆的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • 一文详解springboot中的热启动配置方案

    一文详解springboot中的热启动配置方案

    SpringBoot的热启动主要通过 **`spring-boot-devtools`** 模块实现,能在代码修改后自动重启应用,大幅提升开发效率,下面小编就来和大家讲讲详细配置和使用指南
    2025-07-07

最新评论