java for循环内执行多线程

前言


一、java用多线程来加快循环效率

1.线程池搭配闭锁

涉及知识:Executors(线程池)、CountDownLatch(闭锁)

优点:代码简洁,方便阅读,性能稳定;

缺点:Executors创建的线程池是公用的,如果多个地方使用这种循环多线程的方式,就会抢夺线程池资源,这样运行速度也会降低;

import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class test{
    
    
 
    /** 固定的线程池(当前线程池大小为5) */
    private static final ExecutorService executor = Executors.newFixedThreadPool(5);
    
    public static void main(String[] args) throws Exception {
    
    
        /**
         *  两个要点:
         *  1.用Executors实现固定大小的线程池,从而达到控制硬件资源消耗的目的。
         *  2.用CountDownLatch(闭锁),来确保循环内的多线程都执行完成后,再执行后续代码
         */
        
        // 初始化数据
        List<Map<String,Object>> list = new ArrayList<>();
        for(int i=0;i<50;i++){
    
    
            Map<String,Object> object = new HashMap<>();
            object.put("index",i);
            list.add(object);
        }
 
        // 初始化计时器
        CountDownLatch cdl = new CountDownLatch(list.size());
        System.out.println("====== 线程开始 =====");
 
        // 遍历
        for(Map<String,Object> object:list){
    
    
            // 开启线程
            executor.submit(new Runnable() {
    
    
                @Override
                public void run() {
    
    
                    try {
    
    
                        Thread t = Thread.currentThread();
                        String name = t.getName();
                        // 模拟运行耗时
                        Thread.sleep(500);
                        System.out.println(name+":执行到"+object.get("index"));
                        object.put("status","已经执行过");
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                    // 闭锁-1
                    cdl.countDown();
                }
            });
        }
        
        // 调用闭锁的await()方法,该线程会被挂起,它会等待直到count值为0才继续执行
        // 这样我们就能确保上面多线程都执行完了才走后续代码
        cdl.await();
        
        //关闭线程池
        executor.shutdown();
        System.out.println("====== 线程结束 =====");
 
        // 校验多线程正确性
        for(Map<String,Object> object:list){
    
    
            System.out.println(object.get("index") + ":" + object.get("status"));
        }
 
    }
}

在这里插入图片描述


总结

如果此篇文章有帮助到您, 希望打大佬们能关注点赞收藏评论支持一波,非常感谢大家!
如果有不对的地方请指正!!!

参考1
参考2
参考3

猜你喜欢

转载自blog.csdn.net/weixin_42326851/article/details/129319075