📜  Java中的消息传递(1)

📅  最后修改于: 2023-12-03 15:16:33.918000             🧑  作者: Mango

Java中的消息传递

在Java中,消息传递是一种重要的编程模式,用于在程序中实现不同模块之间的通信。

消息传递的三种实现方式
1. 通过共享内存实现消息传递

共享内存是最常用的实现消息传递的方式。不同模块之间可以通过访问同一块共享内存来进行通信。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进行通信。

2. 通过Socket实现消息传递

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连接服务器,并发送消息。

3. 通过消息队列实现消息传递

消息队列是在不同模块之间传递消息的常用组件。在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、消息队列等不同方式,可以实现不同场景下的消息传递需求。