美文网首页
多线程处理数据,限制并发数量,等待多线程执行结束反馈结果

多线程处理数据,限制并发数量,等待多线程执行结束反馈结果

作者: 承诺一时的华丽 | 来源:发表于2022-12-12 17:28 被阅读0次
 public void pushDataTask() throws InterruptedException {
        logger.debug("===================>> 启动推送数据任务.. <<===================");
        ExecutorService executorService = Executors.newFixedThreadPool(1);
        // 可实现控制线程同时执行的数量 
        Semaphore semaphore = new Semaphore(2);

        // 消息推送
        LambdaQueryWrapper<Sys_DataPushConfig> pushConfigWrapper = new LambdaQueryWrapper<>();
        pushConfigWrapper.eq(Sys_DataPushConfig::getState, StateType.启用.type);
        List<Sys_DataPushConfig> pushConfigList = pushConfigService.selectList(pushConfigWrapper);
        if (pushConfigList == null || pushConfigList.isEmpty()) {
            // 无推送应用
            logger.debug("===================>> 无推送应用数量。 <<===================");
            return;
        }

        logger.debug("===================>> 推送应用数量:" + pushConfigList.size());

        // 推送数据
        LambdaQueryWrapper<Sys_DataPushRecord> dataPushRecordWrapper = new LambdaQueryWrapper<>();
        dataPushRecordWrapper.eq(Sys_DataPushRecord::getProcessStatus, ProcessStatusType.待处理.type);
        List<Sys_DataPushRecord> dataPushRecords = dataPushRecordService.selectList(dataPushRecordWrapper);

        logger.debug("===================>> 推送的数据量:" + dataPushRecords.size());
        for (Sys_DataPushRecord record : dataPushRecords) {
            // 可等待pushConfigList执行完后,再执行下一条数据,保证对多个应用数据处理结果的一致性
            CountDownLatch latch = new CountDownLatch(pushConfigList.size());
            for (Sys_DataPushConfig config : pushConfigList) {
                logger.debug("===================>> 数据处理:" + dataPushRecords.size());
                Runnable runnable = () -> {
                    try {
                        semaphore.acquire();
                        // 开始处理数据
                        logger.debug(Thread.currentThread().getName() + "------------------" + semaphore.availablePermits() + "\t" + "开始处理数据:config=>" + config.getAppName() + ",record:" + JSONUtil.toJsonStr(record));
                        Thread.sleep(1000);
                        semaphore.release();
                        latch.countDown();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                };
                executorService.execute(runnable);

            }
            latch.await();
            // 更新该条数据的处理最终结果
            // ...

        }
        executorService.shutdown();
        logger.debug("===================>> 结束推送数据任务。 <<===================");
    }

相关文章

  • 多线程处理数据,限制并发数量,等待多线程执行结束反馈结果

  • Java 多线程(四):ThreadLocal 详解

    ThreadLocal 多线程在并发执行时,需要数据共享,因此才有了 volatile 变量解决多线程数据之间可见...

  • 线程-11.24

    1.使用threading模块 单线程执行: 多线程执行: 主线程会等待所有的子线程结束后才结束 查看线程数量: ...

  • GCD的使用,同步和异步,串行和并行

    多线程并发(同时)执行,其实就是CPU快速地在多线程之间的快速调度,就会造成多线程并发执行的假象;多线程下,不要相...

  • 利用spring实现多线程 + 事务回滚

    前言 利用线程池和CountDownLatch,多线程并发处理批量数据,实现多线程事务回滚,事务补偿。 begin...

  • 队列和线程

    [iOS多线程中,队列和执行的排列组合结果分析] 多线程中的队列有:串行队列,并发队列,全局队列,主队列。 执行的...

  • 多线程

    1、多线程简介 1、多线程原理 同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 多线程并发(同时)执...

  • 《谈谈NSOperation和GCD》

    多线程原理: 但处理器应对多线程的情况下,并发是一种模拟状态,操作系统会让这些多线程轮流执行好,每次只执行一小段时...

  • iOS多线程随笔

    1. 多线程的并发控制 1.1 在CGD中快速实现多线程的并发控制 NSOperationQueue来处理并发控制...

  • python多线程并发数量控制

    python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误。控制多线程并发数...

网友评论

      本文标题:多线程处理数据,限制并发数量,等待多线程执行结束反馈结果

      本文链接:https://www.haomeiwen.com/subject/piwfqdtx.html