用java内部队列实现推送任务和消费任务的解耦合

直接贴代码,拿过去直接就能用

复制代码
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 用java内部队列实现推送任务和消费任务的解耦合
 * 队列的大小和线程池的大小可以根据实际情况进行调整
 */
@Service
@Slf4j
public class PushTaskQueueService implements InitializingBean, DisposableBean {


    @Autowired
    private PushTaskDoService pushTaskDoService;

    //队列
    private final LinkedBlockingQueue<MaterialPushTask> queue = new LinkedBlockingQueue<>(10000);

    private boolean toStop = false;
    private Thread writeThread;


    //往队列放数据
    public void addTask(MaterialPushTask task) {
        queue.offer(task);
    }

    public MaterialPushTask takeTask() throws InterruptedException {
        return queue.take();
    }


    @Override
    public void destroy() throws Exception {
        queue.clear();
    }

    //项目启动加载的代码
    @Override
    public void afterPropertiesSet() throws Exception {
        this.writeThread = new Thread(() -> doOperation(), "task-operation-thread");
        this.writeThread.setDaemon(true);
        this.writeThread.start();
        this.toStop = false;
    }


    public void stop() {
        this.toStop = true; //设置停止标志
        this.writeThread.interrupt(); //中断线程
    }

    private void doOperation() {
        while (!toStop) {
            try {
                MaterialPushTask task = queue.take();
                //TODO 这里写具体的操作逻辑
                pushTaskDoService.pushTaskDo(task);
                log.info("素材任务推送执行任务:{}", task.toString());
            } catch (InterruptedException e) {
                //忽略异常
                Thread.currentThread().interrupt();
            }
        }
    }


}
复制代码

 

posted @   知行IT讲堂  阅读(2)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
历史上的今天:
2017-08-02 jquery ui 插架 之 dataTable 显示横向滚动条
点击右上角即可分享
微信分享提示