• java for循环内执行多线程


    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();
                        } finally {
                            cdl.countDown();// 闭锁-1
                        }
                    }
                });
            }
            
            // 调用闭锁的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
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    添加子线程共享session,预防多线程中使用异步导致报错

    ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    RequestContextHolder.setRequestAttributes(servletRequestAttributes, true);//设置子线程共享
    
    • 1
    • 2
  • 相关阅读:
    nest笔记九:参数校验使用延伸
    SC-RoadDeepNet学习笔记(持续更新)
    JAVA数据类型详解
    python操作sqlite报错:sqlite3.OperationalError: unrecognized token: “630008.OF“
    Java SPI的原理和实践
    聊聊分布式架构04——RPC通信原理
    Eureka 相关配置及特性
    【Spring面试】二、BeanFactory与IoC容器的加载
    Ubuntu 20.04降级clang-format
    信息学奥赛一本通2062:【例1.3】电影票
  • 原文地址:https://blog.csdn.net/qq_18896247/article/details/134081146