模拟任务积压

news/2024/7/8 9:18:46 标签: java, 中间件

         这个demo没有实质意义,只是简单模拟一下任务积压的场景。

java">    private static final ExecutorService PRODUCER = Executors.newFixedThreadPool(1);
    private static final ThreadPoolExecutor CONSUMER = new ThreadPoolExecutor(3, 3, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
    private static final LinkedBlockingQueue<Runnable> QUEUE = new LinkedBlockingQueue<>();
    public static void main(String[] args) throws InterruptedException {
        // 启动生产者线程
        produce();
        // 启动消费者线程
        consume();
    }

    private static void produce() {
        // 启动一个新的线程作为生产者
        PRODUCER.execute(() -> {
            // 使用AtomicInteger来管理任务编号,确保线程安全
            AtomicInteger i = new AtomicInteger();
            while (true) {
                // 将一个任务添加到队列中
                QUEUE.add(() -> {
                    // 模拟任务需要长时间执行
                    try {
                        Thread.sleep(8000);
                    } catch (InterruptedException e) {
                        // 将中断异常转换为运行时异常,以便抛出
                        throw new RuntimeException(e);
                    }
                    // 执行任务,并输出任务编号
                    log.info("执行任务 {}" , i.getAndIncrement());
                });
                // 模拟生产者添加任务的频率,间隔2秒
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // 将中断异常转换为运行时异常,以便抛出
                    throw new RuntimeException(e);
                }
            }
        });
    }

    private static void consume() throws InterruptedException {
        // 无限循环,用于持续处理队列中的任务
        while (true){
            // 从队列中获取一个任务,该任务是待执行的Runnable对象
            Runnable task = QUEUE.take();
            // 获取队列当前的大小,用于监控队列的状态
            int size = QUEUE.size();
            // 输出队列当前的大小,用于日志记录或调试
            log.info("当前队列大小 {}",size);
            // 执行获取到的任务
            CONSUMER.execute(task);
            try {
                // 使当前线程休眠8秒,目的是控制任务处理的频率
                // 或者说,给队列填充新任务留下时间
                Thread.sleep(8000);
            } catch (InterruptedException e) {
                // 线程被中断时,抛出运行时异常
                // 这样做是为了让上层调用者能够处理中断情况
                throw new RuntimeException(e);
            }
        }
    }

代码总结

这段代码的主要功能是实现一个简单的生产者-消费者模型:

  • 生产者:每隔2秒向队列中添加一个任务,任务执行时会休眠8秒并输出任务编号。
  • 消费者:每隔8秒从队列中取出一个任务并执行,同时输出当前队列的大小。

通过这种方式,代码模拟了一个生产者和消费者之间的任务处理流程,生产者以固定频率生成任务,消费者以固定频率处理任务,并通过队列进行任务的传递和缓冲。


http://www.niftyadmin.cn/n/5536943.html

相关文章

视频共享融合赋能平台LntonCVS安防监控平台现场方案实现和应用场景

LntonCVS国标视频融合云平台采用端-边-云一体化架构&#xff0c;部署简单灵活&#xff0c;功能多样化。支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;和多类型设备接入&#xff08;IPC/NVR/监控平台&#xff09;。主要功能包括视频直…

Ubuntu 下 LXD 安装配置与调优指南

今天我就给你来分享一下在阿贝云这个不错的免费服务器上部署 LXD 的精彩经历。这家免费云服务器确实不错,虽然只有1核CPU、1G内存、10G硬盘和5M带宽,但性能完全能应付日常使用。废话不多说,让我们开始进入主题吧。 LXD 是一个开源的容器管理软件,可以让你像管理虚拟机一样管理…

leetcode hot100

哈希 49.字母异位词分组 HashMap的含义比较晕&#xff0c;可以重做 双指针 11.盛最多水的容器 双指针的起始位置和移动条件没转过来&#xff0c;可以重做 15.三数之和 不太熟练&#xff0c;可以再做一遍 42.接雨水 还可以用dp和单调栈做 双指针法&#xff1a; 首先需要注意…

linux - cp 命令

问&#xff1a;cp -r ./src/. ./dst 与 cp -r ./src/* ./dst 有什么区别? 1.隐藏文件和目录&#xff1a;cp -r ./src/* ./dst 不会复制隐藏文件和目录。cp -r ./src/. ./dst 会复制所有文件和目录&#xff0c;包括隐藏文件和目录。 2.通配符和当前目录&#xff1a;* 是一个通…

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2(全开源版)

>>>系统简述&#xff1a; 抖音阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xff0c;多…

Foxit Reader(福昕阅读器)详细安装和使用教程

第一部分&#xff1a;Foxit Reader简介和基本信息 1.1 什么是Foxit Reader&#xff1f; Foxit Reader&#xff08;福昕阅读器&#xff09;是一款功能强大的PDF阅读和编辑软件&#xff0c;以其快速、轻巧和丰富的功能而闻名。它不仅支持常规的PDF阅读功能&#xff0c;还提供了…

ThinkPHP定时任务是怎样实现的?

接到一个需求&#xff1a;定时检查设备信息&#xff0c;2分钟没有心跳的机器&#xff0c;推送消息给相关人员&#xff0c;用thinkphp5框架&#xff0c;利用框架自带的任务功能与crontab配合来完成定时任务。 第一步&#xff1a;分析需求 先写获取设备信息&#xff0c;2分钟之…

从0构建一款appium-inspector工具

上一篇博客从源码层面解释了appium-inspector工具实现原理&#xff0c;这篇博客将介绍如何从0构建一款简单的类似appium-inspector的工具。如果要实现一款类似appium-inspector的demo工具&#xff0c;大致需要完成如下六个模块内容 启动 Appium 服务器连接到移动设备或模拟器启…