本文详细介绍了手写消息中间件的相关知识,包括手写消息中间件前的准备工作、设计消息中间件的基本组件、实现消息中间件的核心功能以及测试和调试消息中间件的方法。通过这些内容,读者可以全面了解如何开发和使用手写消息中间件。
消息中间件简介
消息中间件是一种软件系统,它能够实现应用组件之间、分布式系统之间的异步或者同步的数据交换和通信。通过消息中间件,应用组件之间无需直接调用对方的接口,而是通过发送和接收消息来实现数据交换。消息中间件有助于实现系统的解耦,提高系统的可维护性、可扩展性、可重用性等。
消息中间件的作用和好处
消息中间件的主要作用是实现系统间的解耦,提高系统的灵活性和可维护性。具体来说,消息中间件的主要好处包括:
- 解耦:消息中间件使得不同的应用组件之间无需直接调用对方的接口,而是通过发送和接收消息来实现数据交换,这样可以减少组件之间的依赖性,实现更好的解耦。
- 扩展性:通过消息中间件,可以在不修改现有代码的情况下,轻松地添加新的组件或服务,提高系统的可扩展性。
- 可靠性:消息中间件通常提供了消息的持久化和确认机制,可以确保消息可靠地传递和处理。
- 异步处理:消息中间件支持异步的消息传递,可以提高系统的响应速度和性能。
- 负载均衡:消息中间件通常支持负载均衡,可以将消息分发到不同的消费者组件,实现负载均衡。
- 容错处理:消息中间件通常提供了容错机制,可以处理消息丢失或消费者故障等情况。
手写消息中间件前的准备工作
在开始手写消息中间件之前,需要做一些准备工作,包括理解消息传递的基本概念和选择合适的编程语言和开发环境。
理解消息传递的基本概念
在开始手写消息中间件之前,首先要理解消息传递的基本概念。消息传递是指应用组件之间通过发送和接收消息来实现数据交换的过程。在消息中间件中,消息通常会被发送到一个消息队列中,然后由消费者从队列中接收消息并进行处理。
消息传递包括以下基本概念:
- 消息队列:消息队列是一个存储消息的容器,生产者将消息发送到队列中,消费者从队列中接收消息。
- 生产者:生产者是生成消息并将其发送到消息队列的应用组件。
- 消费者:消费者是接收消息并对其进行处理的应用组件。
- 消息:消息是包含数据和元数据的数据结构,通常包含消息头和消息体。
- 消息传递模式:消息传递模式是指消息传递的方式和策略,常见的消息传递模式包括同步传递、异步传递和发布/订阅模式。
- 消息传递协议:消息传递协议是指消息传递的方式和规则,常见的消息传递协议包括AMQP、MQTT和JMS等。
选择合适的编程语言和开发环境
在选择合适的编程语言和开发环境时,需要考虑如下因素:
- 编程语言:选择一种支持并发编程和网络编程的编程语言。常用的编程语言包括Java、Python和Go等。
- 开发环境:选择一种支持多线程和网络编程的开发环境。常用的开发环境包括Eclipse、IntelliJ IDEA和Visual Studio等。
- 消息队列:选择一种消息队列实现,常用的实现包括RabbitMQ、Kafka和ActiveMQ等。
以下是一个简单的Java消息队列的示例代码:
import java.util.concurrent.*;
public class SimpleQueue<T> {
private final BlockingQueue<T> queue;
public SimpleQueue(int capacity) {
this.queue = new ArrayBlockingQueue<>(capacity);
}
public void enqueue(T item) throws InterruptedException {
queue.put(item);
}
public T dequeue() throws InterruptedException {
return queue.take();
}
}
设计消息中间件的基本组件
设计消息中间件的基本组件包括消息队列的设计、生产者与消费者角色的定义和如何处理消息的持久化。
消息队列的设计
消息队列是消息中间件的核心组件之一,它负责存储消息并提供消息的发送和接收。消息队列的设计需要考虑如下因素:
- 队列类型:队列类型是指队列的数据结构,常见的队列类型包括循环队列、链式队列和数组队列等。
- 队列容量:队列容量是指队列的最大容量,需要根据实际需求进行设置。
- 队列锁:队列锁是指保证队列操作的线程安全,常见的队列锁包括互斥锁和读写锁等。
- 队列持久化:队列持久化是指将队列中的消息持久化到磁盘上,以防止数据丢失。
以下是一个简单的Java循环队列的示例代码:
public class CircularQueue<T> {
private T[] items;
private int head;
private int tail;
private int capacity;
public CircularQueue(int capacity) {
this.capacity = capacity;
items = (T[]) new Object[capacity];
}
public void enqueue(T item) {
if ((tail + 1) % capacity == head) {
throw new RuntimeException("Queue is full");
}
items[tail] = item;
tail = (tail + 1) % capacity;
}
public T dequeue() {
if (head == tail) {
throw new RuntimeException("Queue is empty");
}
T item = items[head];
head = (head + 1) % capacity;
return item;
}
}
以下是链式队列的示例代码:
public class LinkedListQueue<T> {
private Node<T> head;
private Node<T> tail;
private static class Node<T> {
T item;
Node<T> next;
public Node(T item) {
this.item = item;
this.next = null;
}
}
public void enqueue(T item) {
Node<T> newNode = new Node<>(item);
if (tail == null) {
head = tail = newNode;
} else {
tail.next = newNode;
tail = newNode;
}
}
public T dequeue() {
if (head == null) {
throw new RuntimeException("Queue is empty");
}
T item = head.item;
head = head.next;
if (head == null) {
tail = null;
}
return item;
}
}
生产者与消费者角色的定义
生产者与消费者角色是指消息中间件中的两个基本角色,它们分别负责生成和处理消息。生产者与消费者角色的定义需要考虑如下因素:
- 生产者:生产者是生成消息并将其发送到消息队列的应用组件。
- 消费者:消费者是接收消息并对其进行处理的应用组件。
- 生产者线程:生产者线程是指负责生成消息并将其发送到消息队列的线程。
- 消费者线程:消费者线程是指负责接收消息并对其进行处理的线程。
- 生产者-消费者模式:生产者-消费者模式是指生产者线程和消费者线程之间的协作方式。
以下是一个简单的Java生产者-消费者模式的示例代码:
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ProducerConsumerExample {
private final ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
public void producer() {
ExecutorService producerService = Executors.newSingleThreadExecutor();
producerService.execute(() -> {
for (int i = 0; i < 10; i++) {
try {
queue.put("Message " + i);
System.out.println("Produced: " + "Message " + i);
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
public void consumer() {
ExecutorService consumerService = Executors.newSingleThreadExecutor();
consumerService.execute(() -> {
try {
while (true) {
String message = queue.take();
System.out.println("Consumed: " + message);
TimeUnit.MILLISECONDS.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
以下是处理并发和多线程的生产者-消费者模式的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ConcurrentProducerConsumerExample {
private final ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10);
public void producer() {
ExecutorService producerService = Executors.newFixedThreadPool(2);
producerService.execute(() -> {
for (int i = 0; i < 10; i++) {
try {
queue.put("Message " + i);
System.out.println("Produced: " + "Message " + i);
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
public void consumer() {
ExecutorService consumerService = Executors.newFixedThreadPool(2);
consumerService.execute(() -> {
try {
while (true) {
String message = queue.take();
System.out.println("Consumed: " + message);
TimeUnit.MILLISECONDS.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
如何处理消息的持久化
消息持久化是指将消息持久化到磁盘或其他持久化介质上,以防止数据丢失。处理消息的持久化需要考虑如下因素:
- 消息存储:消息存储是指将消息持久化到磁盘或其他持久化介质上的方式,常见的消息存储包括文件系统存储、数据库存储和分布式存储等。
- 消息序列化:消息序列化是指将消息转换为字节流或其他可以存储的形式,常见的消息序列化包括JSON序列化、XML序列化和二进制序列化等。
- 消息恢复:消息恢复是指在系统重启或故障恢复后,重新从持久化介质中恢复消息并继续处理,常见的消息恢复包括文件读取恢复、数据库查询恢复和日志恢复等。
以下是一个简单的Java消息持久化的示例代码:
import java.io.*;
public class MessagePersistence {
public void saveMessage(String message) throws IOException {
try (FileWriter writer = new FileWriter("message.txt", true)) {
writer.write(message + "\n");
}
}
public String loadMessage() throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader("message.txt"))) {
return reader.readLine();
}
}
}
以下是数据库存储的示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class DatabaseMessagePersistence {
private static final String URL = "jdbc:mysql://localhost:3306/message_db";
private static final String USER = "root";
private static final String PASSWORD = "password";
public void saveMessage(String message) throws Exception {
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement stmt = conn.prepareStatement("INSERT INTO messages (content) VALUES (?)")) {
stmt.setString(1, message);
stmt.executeUpdate();
}
}
public String loadMessage() throws Exception {
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement stmt = conn.prepareStatement("SELECT content FROM messages ORDER BY id DESC LIMIT 1")) {
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return rs.getString("content");
}
return null;
}
}
}
实现消息中间件的核心功能
实现消息中间件的核心功能包括消息的发送与接收、消息的可靠传递与确认机制和处理并发和异步消息传递。
消息的发送与接收
消息的发送与接收是指生产者将消息发送到消息队列中,消费者从队列中接收消息并进行处理的过程。实现消息的发送与接收需要考虑如下因素:
- 消息发送:消息发送是指生产者将消息发送到消息队列中的过程,常见的消息发送包括同步发送和异步发送等。
- 消息接收:消息接收是指消费者从消息队列中接收消息的过程,常见的消息接收包括轮询接收和事件驱动接收等。
- 消息传递模式:消息传递模式是指消息传递的方式和策略,常见的消息传递模式包括同步传递、异步传递和发布/订阅模式等。
以下是一个简单的Java消息发送与接收的示例代码:
public class MessageSender {
private final SimpleQueue<String> queue;
public MessageSender(SimpleQueue<String> queue) {
this.queue = queue;
}
public void sendMessage(String message) throws InterruptedException {
queue.enqueue(message);
}
}
public class MessageReceiver {
private final SimpleQueue<String> queue;
public MessageReceiver(SimpleQueue<String> queue) {
this.queue = queue;
}
public String receiveMessage() throws InterruptedException {
return queue.dequeue();
}
}
以下是异步发送与接收的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class AsyncMessageExample {
private final SimpleQueue<String> queue;
public AsyncMessageExample(SimpleQueue<String> queue) {
this.queue = queue;
}
public void sendMessage(String message) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
queue.enqueue(message);
System.out.println("Message sent: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public String receiveMessage() throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
String message = "";
executor.execute(() -> {
try {
message = queue.dequeue();
System.out.println("Message received: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
TimeUnit.MILLISECONDS.sleep(500); // Wait for message to be processed
return message;
}
}
消息的可靠传递与确认机制
消息的可靠传递是指消息能够可靠地从生产者传递到消费者的过程,常见的消息可靠传递包括消息的持久化、消息的确认机制和消息的重试机制等。实现消息的可靠传递需要考虑如下因素:
- 消息持久化:消息持久化是指将消息持久化到磁盘或其他持久化介质上的方式,常见的消息持久化包括文件系统存储、数据库存储和分布式存储等。
- 消息确认机制:消息确认机制是指在消息传递过程中,消费者可以向生产者发送确认消息,以确认消息已经成功接收并处理,常见的消息确认机制包括同步确认和异步确认等。
- 消息重试机制:消息重试机制是指在消息传递过程中,如果消息传递失败,可以自动重试传递,常见的消息重试机制包括定时重试和指数退避等。
以下是一个简单的Java消息可靠传递的示例代码:
public class MessageSenderWithAck {
private final SimpleQueue<String> queue;
public MessageSenderWithAck(SimpleQueue<String> queue) {
this.queue = queue;
}
public void sendMessage(String message, MessageReceiver receiver) throws InterruptedException {
queue.enqueue(message);
receiver.receiveMessage(); // Wait for message to be processed
queue.enqueue("ACK"); // Send ACK message
}
public boolean isMessageAcknowledged() throws InterruptedException {
return queue.dequeue().equals("ACK");
}
}
public class MessageReceiverWithAck {
private final SimpleQueue<String> queue;
public MessageReceiverWithAck(SimpleQueue<String> queue) {
this.queue = queue;
}
public String receiveMessage() throws InterruptedException {
return queue.dequeue();
}
public void acknowledgeMessage() throws InterruptedException {
queue.enqueue("ACK");
}
}
以下是消息确认机制和重试机制的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ReliableMessageExample {
private final SimpleQueue<String> queue;
private final ExecutorService executor;
public ReliableMessageExample(SimpleQueue<String> queue) {
this.queue = queue;
this.executor = Executors.newSingleThreadExecutor();
}
public void sendMessage(String message, MessageReceiver receiver) throws InterruptedException {
executor.execute(() -> {
try {
queue.enqueue(message);
receiver.receiveMessage(); // Wait for message to be processed
queue.enqueue("ACK"); // Send ACK message
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public boolean isMessageAcknowledged() throws InterruptedException {
return queue.dequeue().equals("ACK");
}
}
public class ReliableMessageReceiver {
private final SimpleQueue<String> queue;
public ReliableMessageReceiver(SimpleQueue<String> queue) {
this.queue = queue;
}
public String receiveMessage() throws InterruptedException {
return queue.dequeue();
}
public void acknowledgeMessage() throws InterruptedException {
queue.enqueue("ACK");
}
}
处理并发和异步消息传递
处理并发和异步消息传递是指在消息传递过程中,需要处理多个生产者和消费者之间的并发和异步消息传递。处理并发和异步消息传递需要考虑如下因素:
- 并发控制:并发控制是指在多个生产者和消费者之间进行并发控制,以防止消息传递中的数据冲突,常见的并发控制包括锁机制和信号量机制等。
- 异步消息传递:异步消息传递是指在消息传递过程中,生产者可以异步地发送消息,消费者可以异步地接收消息,常见的异步消息传递包括异步发送和异步接收等。
- 消息队列管理:消息队列管理是指在多个生产者和消费者之间进行消息队列管理,常见的消息队列管理包括负载均衡和消息路由等。
以下是一个简单的Java异步消息传递的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class AsyncMessageExample {
private final SimpleQueue<String> queue;
public AsyncMessageExample(SimpleQueue<String> queue) {
this.queue = queue;
}
public void sendMessage(String message) throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
queue.enqueue(message);
System.out.println("Message sent: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public String receiveMessage() throws InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
String message = "";
executor.execute(() -> {
try {
message = queue.dequeue();
System.out.println("Message received: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
TimeUnit.MILLISECONDS.sleep(500); // Wait for message to be processed
return message;
}
}
以下是多生产者-多消费者模式的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class MultiProducerMultiConsumerExample {
private final SimpleQueue<String> queue;
public MultiProducerMultiConsumerExample(SimpleQueue<String> queue) {
this.queue = queue;
}
public void start() {
ExecutorService producerExecutor = Executors.newFixedThreadPool(2);
ExecutorService consumerExecutor = Executors.newFixedThreadPool(2);
producerExecutor.execute(() -> {
for (int i = 0; i < 10; i++) {
try {
queue.enqueue("Message " + i);
System.out.println("Produced: " + "Message " + i);
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
consumerExecutor.execute(() -> {
try {
while (true) {
String message = queue.dequeue();
System.out.println("Consumed: " + message);
TimeUnit.MILLISECONDS.sleep(500);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
测试和调试消息中间件
测试和调试消息中间件是指在开发过程中,进行单元测试、集成测试和性能测试等,以确保消息中间件的正确性和性能。测试和调试消息中间件需要考虑如下因素:
- 单元测试:单元测试是指对消息中间件的基本组件进行测试,以确保其正确性和性能。
- 集成测试:集成测试是指对消息中间件的多个组件进行测试,以确保其正确性和性能。
- 性能测试:性能测试是指对消息中间件的性能进行测试,以确保其性能达到预期。
- 调试常见问题与解决方案:调试常见问题与解决方案是指在开发过程中,遇到常见问题时,可以参考解决方案进行调试。
- 性能优化与调优:性能优化与调优是指在开发过程中,对消息中间件的性能进行优化和调优,以提高其性能。
以下是一个简单的Java单元测试的示例代码:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class SimpleQueueTest {
@Test
public void testEnqueueDequeue() throws InterruptedException {
SimpleQueue<Integer> queue = new SimpleQueue<>(10);
queue.enqueue(1);
queue.enqueue(2);
assertEquals(1, queue.dequeue());
assertEquals(2, queue.dequeue());
}
@Test
public void testIsFull() throws InterruptedException {
SimpleQueue<Integer> queue = new SimpleQueue<>(2);
queue.enqueue(1);
queue.enqueue(2);
assertThrows(RuntimeException.class, () -> queue.enqueue(3));
}
}
以下是集成测试的示例代码:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class MessageSystemIntegrationTest {
@Test
public void testIntegration() throws InterruptedException {
SimpleQueue<String> queue = new SimpleQueue<>(10);
ProducerConsumerExample example = new ProducerConsumerExample(queue);
example.producer();
example.consumer();
// Assert messages are sent and received correctly
}
}
以下是性能测试的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class PerformanceTest {
private final SimpleQueue<String> queue;
private final ExecutorService producerService;
private final ExecutorService consumerService;
public PerformanceTest(SimpleQueue<String> queue) {
this.queue = queue;
producerService = Executors.newFixedThreadPool(2);
consumerService = Executors.newFixedThreadPool(2);
}
public void start() {
producerService.execute(() -> {
for (int i = 0; i < 10000; i++) {
try {
queue.enqueue("Message " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
consumerService.execute(() -> {
try {
for (int i = 0; i < 10000; i++) {
queue.dequeue();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
});
producerService.shutdown();
consumerService.shutdown();
try {
producerService.awaitTermination(1, TimeUnit.MINUTES);
consumerService.awaitTermination(1, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
PerformanceTest test = new PerformanceTest(new SimpleQueue<>(10000));
test.start();
}
}
实际应用案例分享
实际应用案例分享是指在实际应用中,使用消息中间件实现各种功能和效果。实际应用案例分享需要考虑如下因素:
- 使用场景:使用场景是指消息中间件在实际应用中的使用场景,常见的使用场景包括异步处理、负载均衡和容错处理等。
- 用户反馈和改进建议:用户反馈和改进建议是指在实际应用中,用户反馈的消息中间件的问题和改进建议。
- 扩展与维护指南:扩展与维护指南是指在实际应用中,对消息中间件进行扩展和维护的指南。
实践中的使用场景
在实际应用中,消息中间件可以用于各种场景,包括:
- 异步处理:消息中间件可以用于实现异步处理,例如,用户提交表单后,可以通过消息中间件异步地处理表单数据,提高系统的响应速度。
- 负载均衡:消息中间件可以用于实现负载均衡,例如,多个消费者可以同时从消息队列中接收消息并进行处理,提高系统的处理能力。
- 容错处理:消息中间件可以用于实现容错处理,例如,如果消费者故障,可以通过消息中间件重新将消息发送到其他消费者,提高系统的可靠性。
以下是异步处理的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class AsyncFormProcessor {
private final SimpleQueue<String> queue;
public AsyncFormProcessor(SimpleQueue<String> queue) {
this.queue = queue;
}
public void processForm(String formData) {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try {
queue.enqueue(formData);
System.out.println("Form data sent: " + formData);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
用户反馈和改进建议
在实际应用中,用户反馈的消息中间件的问题和改进建议包括:
- 性能问题:在高负载情况下,消息中间件的性能可能会受到影响,可以使用性能优化和调优技术来提高其性能。
- 可靠性问题:在消息传递过程中,可能会出现消息丢失或消费者故障等问题,可以使用消息可靠传递和确认机制来提高其可靠性。
- 可扩展性问题:在系统扩展时,消息中间件的可扩展性可能会受到影响,可以使用消息队列管理和消息传递模式来提高其可扩展性。
以下是解决性能问题的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PerformanceOptimization {
private final SimpleQueue<String> queue;
public PerformanceOptimization(SimpleQueue<String> queue) {
this.queue = queue;
}
public void sendMessage(String message) {
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.execute(() -> {
try {
queue.enqueue(message);
System.out.println("Message sent: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
扩展与维护指南
在实际应用中,对消息中间件进行扩展和维护的指南包括:
- 扩展消息中间件:在扩展消息中间件时,可以使用消息队列管理和消息传递模式等技术来提高其可扩展性。
- 维护消息中间件:在维护消息中间件时,可以使用单元测试、集成测试和性能测试等技术来确保其正确性和性能。
- 优化消息中间件:在优化消息中间件时,可以使用性能优化和调优技术来提高其性能。
以下是扩展消息中间件的示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExtendingMessageMiddleware {
private final SimpleQueue<String> queue;
private final ExecutorService producerService;
private final ExecutorService consumerService;
public ExtendingMessageMiddleware(SimpleQueue<String> queue) {
this.queue = queue;
producerService = Executors.newFixedThreadPool(2);
consumerService = Executors.newFixedThreadPool(2);
}
public void sendMessage(String message) {
producerService.execute(() -> {
try {
queue.enqueue(message);
System.out.println("Message sent: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
public void receiveMessage() {
consumerService.execute(() -> {
try {
String message = queue.dequeue();
System.out.println("Message received: " + message);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
}
``
共同学习,写下你的评论
评论加载中...
作者其他优质文章