多个线程启动 ,等待全部执行完毕再搜集数据

前几天在公司的项目上有个同事使用了多线程统计数据,当时出现了一个用户一直使用服务器首次登录信息作为查询信息。找了半天才发现,线程池资源同步了。后面手动将数据set进去的。

等待线程全部执行完毕,这里使用的是减法计数器,也可而已用加法计数器:CyclicBarrier

java 复制代码
package com.quxiao.controller;


import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;

/**
 * @program: package1
 * @author: quxiao
 * @create: 2023-09-27 15:22
 **/
public class t3 {
    static final ExecutorService service = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(4);
        FutureTask task1 = new FutureTask<>(new t(2, countDownLatch));
        FutureTask task2 = new FutureTask<>(new t(3, countDownLatch));
        FutureTask task3 = new FutureTask<>(new t(4, countDownLatch));
        FutureTask task4 = new FutureTask<>(new t(5, countDownLatch));
        service.execute(task1);
        service.execute(task2);
        service.execute(task3);
        service.execute(task4);
        countDownLatch.await();
        System.out.println(task1.get());
        System.out.println(task2.get());
        System.out.println(task3.get());
        System.out.println(task4.get());
//        service.shutdown();
    }


    static class t implements Callable<List<Integer>> {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        int sum = 0;
        CountDownLatch countDownLatch;

        public t(int sum, CountDownLatch countDownLatch) {
            this.sum = sum;
            this.countDownLatch = countDownLatch;
        }

        @Override
        public List<Integer> call() throws Exception {
            TimeUnit.SECONDS.sleep(1L);
            List<Integer> returnList = list.stream().filter(x -> x >= sum).collect(Collectors.toList());
            countDownLatch.countDown();
            return returnList;
        }
    }
}

限流操作,限制人数访问,超过预定值就等待:

java 复制代码
package com.quxiao.controller;


import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;

/**
 * @program: package1
 * @author: quxiao
 * @create: 2023-09-27 15:22
 **/
public class t3 {
    static final ExecutorService service = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Semaphore semaphore = new Semaphore(3);
        for (int i = 0; i < 9; i++) {
            final int t = i;
            new Thread(() -> {
                try {
                    semaphore.acquire();
                    TimeUnit.SECONDS.sleep(5L);
                    System.out.println(Thread.currentThread().getName() + "进来了");
                    System.out.println(Thread.currentThread().getName() + "出去了");
                    System.out.println();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } finally {
                    semaphore.release();
                }
            }, "" + i).start();
        }
    }
}
相关推荐
重生之我是数学王子2 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
xmh-sxh-13143 分钟前
jdk各个版本介绍
java
Ai 编码助手4 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z8 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹16 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE17 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码22 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶23 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺27 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
zwjapple33 分钟前
typescript里面正则的使用
开发语言·javascript·正则表达式