LinkedBlockingQueue 阻塞队列实现生产/消费模型

编程教程 > Java (2505) 2025-01-27 09:44:00

LinkedBlockingQueue 阻塞队列实现生产/消费模型

package com.example.demospringbootqueueasynctask;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;

/***
 * 通过阻塞队列实现 生产/消费模型的异步任务。
 */
@Service
public class QueueService {
    private static Logger logger = LoggerFactory.getLogger(QueueService.class);
    /**
     * 使用阻塞队列实现 生产消费模型
     * 下面例子中的数据类型暂定为String
     */
    public static LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>();

    /***
     * 线程池,多线程任务处理
     */
    private static ExecutorService threadPool = Executors.newFixedThreadPool(3);


    //启执行
    @PostConstruct
    private void consumer() {
        for (int i = 0; i < 3; i++) {
            threadPool.execute(() -> {
                        while (true) {
                            String message = null;
                            try {
                                Thread.sleep(50);//休息
                                message = queue.take();
                                //模拟消费队列---->做一个输出操作
                                System.out.println("接收到消息:[" + Thread.currentThread().getName() + "]" + message);
                            } catch (Exception e) {
                                logger.error("企业知产同步队列发生了异常:", e);
                                //异常情况可以根据业务考虑是否需要重新放入队列
                                /*if (!StringUtils.isEmpty(message)){
                                    queue.add(message);
                                }*/
                            }
                        }
                    }
            );
        }
    }

    /**
     * 生产者
     */
    public void producer(String message) {
        if (StringUtils.isEmpty(message)) {
            throw new RuntimeException("内容不能为空");
        }
        queue.add(message);
    }

}

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
LinkedBlockingQueue 阻塞队列实现生产/消费模型package com.example.demospringbootqueueasynctask; import org....
创建maven项目添加依赖方便开发,添加一些开发工具依赖,比如 lombok Swing UI开发创建Hello UI在src/main/java/包名下有件菜
BorderLayout 边框布局管理器BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局
在Swing中,任何其他组件都必须位于一个顶层容器中。JFrame 窗口和 JPanel 面板是常用的顶层容器,本节详细介绍这两个容器的使用方法。JFrame
1.使用idea创建JavaFX项目idea创建JavaFX项目创建后运行尝试:运行结果 可以看到目前是能正常运行 Hello Word项目的,这个时候还没有maven支持
问题描述JavaFX maven项目在idea中启动报错:Exception in thread "WindowsNativeRunloopThread" java.lang.NoSuchMet...
问题描述idea启动maven的JavaFX项目报错:Exception in Application start method java.lang.reflect.InvocationTarg...
最近在学习JavaFX,发现资料很少,连基本的图片读取都很多错误版本
问题描述最近写JavaFX程序遇到了下面的错误:Exception in thread "pool-2-thread-1" java.lang.IllegalStateException: No...
thymeleaf 设置不校验html标签
SSH/SSM项目中如何集成thymeleaf?本文将讲解SSH/SSM项目中如何集成thymeleaf模板引擎
Thymeleaf 递归,Thymeleaf模板引擎递归展示如评论留言等场合适用
springboot 使用thymeleaf 模板引擎中url中的&引起的org.xml.sax.SAXParseException: 对实体 "uid" 的引用必须以 ';' 分隔符结尾。问题解决
配置在resources目录下面创建i18n目录,然后创建几个文件messages.properties 默认显示语言内容messages_en_US.prop