Java多线程实现发布和订阅

目录

简介

步骤 1: 定义消息类

步骤 2: 创建发布者

步骤 3: 创建订阅者

步骤 4: 实现发布-订阅模型


前言-与正文无关

        生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡,忘记了停下脚步,感受周围的世界。让我们一起提醒自己,要适时放慢脚步,欣赏生活中的每一道风景,享受与家人朋友的温馨时光,发现那些平凡日子里隐藏的幸福时刻。因为,这些点点滴滴汇聚起来的,才是构成我们丰富多彩生活的本质。希望每个人都能在繁忙的生活中找到自己的快乐之源,不仅仅为了生存而工作,更为了更好的生活而生活。

        送你张美图!希望你开心!

简介

在Java中,实现发布-订阅模型可以通过多种方式完成,包括使用内置的并发工具如BlockingQueue。这里,我们使用LinkedBlockingQueue来演示一个简单的发布-订阅系统,其中发布者将消息放入队列,而订阅者从队列中取出消息进行处理。

步骤 1: 定义消息类

首先,定义一个简单的消息类,用于发布者和订阅者传递消息。

public class Message {
    private String content;

    public Message(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

步骤 2: 创建发布者

发布者(Producer)将消息放入共享的BlockingQueue

import java.util.concurrent.BlockingQueue;

public class Producer implements Runnable {
    private BlockingQueue<Message> queue;

    public Producer(BlockingQueue<Message> q) {
        this.queue = q;
    }

    @Override
    public void run() {
        // 发送消息
        for (int i = 0; i < 10; i++) {
            Message msg = new Message("" + i);
            try {
                Thread.sleep(i);
                queue.put(msg);
                System.out.println("Produced " + msg.getContent());
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }

        // 发送结束消息
        Message msg = new Message("exit");
        try {
            queue.put(msg);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

步骤 3: 创建订阅者

订阅者(Consumer)从BlockingQueue中取出消息并处理。

import java.util.concurrent.BlockingQueue;

public class Consumer implements Runnable {
    private BlockingQueue<Message> queue;

    public Consumer(BlockingQueue<Message> q) {
        this.queue = q;
    }

    @Override
    public void run() {
        try {
            Message msg;
            // 检查消息内容是否为"exit"
            while (!(msg = queue.take()).getContent().equals("exit")) {
                Thread.sleep(10);
                System.out.println("Consumed " + msg.getContent());
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

步骤 4: 实现发布-订阅模型

现在,使用一个LinkedBlockingQueue来连接发布者和订阅者。

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

public class PubSubService {
    public static void main(String[] args) {
        // 创建共享的阻塞队列
        BlockingQueue<Message> queue = new LinkedBlockingQueue<>();

        // 创建并启动发布者和订阅者线程
        Thread producerThread = new Thread(new Producer(queue));
        Thread consumerThread = new Thread(new Consumer(queue));

        producerThread.start();
        consumerThread.start();
    }
}

在这个简单的发布-订阅模型中,Producer类生成消息并将它们放入队列,而Consumer类从队列中取出并处理这些消息。使用LinkedBlockingQueue使得这个过程在多线程环境中是线程安全的,同时还处理了生产者和消费者的速率不匹配问题。

------------------------------------------与正文内容无关------------------------------------
 如果觉的文章写对各位读者老爷们有帮助的话,麻烦点赞加关注呗!作者在这拜谢了!

混口饭吃了!如果你需要Java 、Python毕设、商务合作、技术交流、就业指导、技术支持度过试用期。请在关注私信我,本人看到一定马上回复!

这是我全部文章所在目录,看看是否有你需要的,如果遇到觉得不对地方请留言,看到后我会查阅进行改正。

A乐神-CSDN博客

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java订阅是一种消息模式,其中一个或多个订阅者接收特定主题的消息。在Java中,可以使用消息队列(MQ)或发布/订阅框架来实现订阅模式。以下是使用ActiveMQ实现Java订阅的示例: 1. 首先需要安装ActiveMQ并启动它。 2. 创建一个Java项目并添加ActiveMQ的客户端依赖项。 3. 创建一个消息生产者并发送消息到特定主题: ```java import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class MessageProducer { public static void main(String[] args) throws JMSException { // 创建连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建主题 Topic topic = session.createTopic("myTopic"); // 创建消息生产者 MessageProducer producer = session.createProducer(topic); // 创建消息 TextMessage message = session.createTextMessage("Hello, World!"); // 发送消息 producer.send(message); // 关闭连接 connection.close(); } } ``` 4. 创建一个消息消费者并订阅特定主题: ```java import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; public class MessageConsumer { public static void main(String[] args) throws JMSException, InterruptedException { // 创建连接工厂 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // 创建连接 Connection connection = connectionFactory.createConnection(); connection.start(); // 创建会话 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建主题 Topic topic = session.createTopic("myTopic"); // 创建消息消费者 MessageConsumer consumer = session.createConsumer(topic); // 注册消息监听器 consumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { try { // 处理消息 String text = ((TextMessage) message).getText(); System.out.println("Received message: " + text); } catch (JMSException e) { e.printStackTrace(); } } }); // 等待消息 Thread.sleep(1000); // 关闭连接 connection.close(); } } ``` 这样,当消息生产者发送消息到“myTopic”主题时,消息消费者会接收到该消息并进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A乐神

恭喜发财啊,老板,嘻嘻!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值