Java LinkedBlockingQueue实现消息队列

简介: 最近有个项目需要开发一个预约系统,系统涉及到发送短信验证码;一般用户点击发送验证码,发送请求到后端后,调用短信接口,成功后就返回响应的状态码给用户;但是这样的过程,有时候会因为短信接口响应慢,而导致前端响应慢;所以这里需要做一个简单的优化,当用户点击发送短信时,将我们的短信调用放入一个队列中,放入之后,即给前端响应;后面通过阻塞队列,取出队列内容,进行短信发送即可,这样可以更好的提升系统的性能和用户体验度;

最近有个项目需要开发一个预约系统,系统涉及到发送短信验证码;一般用户点击发送验证码,发送请求到后端后,调用短信接口,成功后就返回响应的状态码给用户;但是这样的过程,有时候会因为短信接口响应慢,而导致前端响应慢;所以这里需要做一个简单的优化,当用户点击发送短信时,将我们的短信调用放入一个队列中,放入之后,即给前端响应;后面通过阻塞队列,取出队列内容,进行短信发送即可,这样可以更好的提升系统的性能和用户体验度;

一、创建短信生产者

public class MessageProducer implements Runnable {
    private BlockingQueue<String> queue;
    private String phone;
    public MessageProducer(BlockingQueue<String> queue, String phone) {
        this.queue = queue;
        this.phone = phone;
    }
    @Override
    public void run() {
        try {
            queue.put(phone);
            System.out.println("手机号码:" + phone);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

二、短信消费者

public class MessageConsumer implements Runnable {
    private BlockingQueue<String> queue;
    public MessageConsumer(BlockingQueue<String> queue) {
        this.queue = queue;
    }
    @Override
    public void run() {
        while (true) {
            System.out.println("等待中------------");
            try {
                String phone = queue.take();
                System.out.println("发送短信:" + phone);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("处理完成------------");
        }
    }
}

三、测试

    public static void main(String[] args) {
        LinkedBlockingQueue<String> queue=new LinkedBlockingQueue<String>(10);
        ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.submit(new MessageConsumer(queue));
        for (int i=0;i<6;i++){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            executorService.submit(new MessageProducer(queue,"消费者"+i));
        }
    }

结果:

当队列中没有消息时,它就会一直进行阻塞

目录
相关文章
|
消息中间件 存储 Java
使用Java构建可扩展的消息队列系统
使用Java构建可扩展的消息队列系统
|
5月前
|
Java
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
前言 有了前文对简单实用的学习 【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门 聪明的你,一定会想知道更多。哈哈哈哈哈,下面主播就...
97 6
【源码】【Java并发】【LinkedBlockingQueue】适合中学体质的LinkedBlockingQueue入门
|
5月前
|
安全 Java
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
前言 你是否在线程池工具类里看到过它的身影? 你是否会好奇LinkedBlockingQueue是啥呢? 没有关系,小手手点上关注,跟上主播的节奏。 什么是LinkedBlockingQueue? ...
183 1
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
|
消息中间件 Java Kafka
如何在Java中实现消息队列
如何在Java中实现消息队列
|
消息中间件 存储 Java
如何在Java中实现消息队列?
如何在Java中实现消息队列?
|
消息中间件 监控 Java
Java中的消息队列技术选型与实现指南
Java中的消息队列技术选型与实现指南
|
消息中间件 存储 Java
使用Java构建一个高性能的消息队列系统
使用Java构建一个高性能的消息队列系统
|
消息中间件 监控 Java
在Java应用中实现微服务间的消息队列通信
在Java应用中实现微服务间的消息队列通信
|
消息中间件 监控 Java
Java中集成消息队列的最佳实践
Java中集成消息队列的最佳实践
|
消息中间件 存储 Java
Java中的消息队列应用与性能优化
Java中的消息队列应用与性能优化

热门文章

最新文章