📅  最后修改于: 2023-12-03 15:16:33.918000             🧑  作者: Mango
在Java中,消息传递是一种重要的编程模式,用于在程序中实现不同模块之间的通信。
共享内存是最常用的实现消息传递的方式。不同模块之间可以通过访问同一块共享内存来进行通信。Java中可以使用多线程和共享变量来实现这种方式。
public class SharedMemoryDemo {
private volatile boolean flag; // 共享变量
public static void main(String[] args) {
SharedMemoryDemo demo = new SharedMemoryDemo();
new Thread(() -> {
while (true) {
if (demo.flag) {
System.out.println("收到消息");
demo.flag = false;
}
}
}).start();
new Thread(() -> {
while (true) {
demo.flag = true;
System.out.println("发送消息");
}
}).start();
}
}
上面的代码演示了通过共享变量实现消息传递的过程。其中,一个线程负责发送消息,另一个线程负责接收消息,通过共享变量flag进行通信。
Socket是Java中用于实现网络通信的重要类,在消息传递中也可以使用Socket实现模块之间的通信。可以通过创建服务器和客户端来实现消息的发送和接收。
// 服务器端
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = reader.readLine();
System.out.println("收到消息:" + message);
socket.close();
}
}
// 客户端
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8888);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("Hello World");
writer.newLine();
writer.flush();
socket.close();
}
}
上面的代码演示了通过Socket实现消息传递的过程。其中,服务器端通过ServerSocket监听指定端口,客户端通过Socket连接服务器,并发送消息。
消息队列是在不同模块之间传递消息的常用组件。在Java中,常用的消息队列包括JMS、ActiveMQ、RabbitMQ等。通过创建消息队列,可以实现模块之间异步通信。
// 发送端
public class ProducerDemo {
private final static String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(QUEUE_NAME);
MessageProducer producer = session.createProducer(queue);
TextMessage message = session.createTextMessage("Hello World");
producer.send(message);
session.close();
connection.close();
}
}
// 接收端
public class ConsumerDemo {
private final static String QUEUE_NAME = "test_queue";
public static void main(String[] args) throws JMSException {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue(QUEUE_NAME);
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(message -> {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("收到消息:" + textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
});
}
}
上面的代码演示了通过ActiveMQ实现消息传递的过程。其中,生产者通过连接ActiveMQ服务器,并在指定队列发送消息;消费者通过连接ActiveMQ服务器,并订阅指定队列,通过setMessageListener设置消息监听器来接收消息。
实现模块间通信的方式非常多样,Java中的消息传递也是非常灵活的。通过共享内存、Socket、消息队列等不同方式,可以实现不同场景下的消息传递需求。