如何使用Message传递编写Producer-Consumer解决方案?

时间:2012-04-05 10:44:52

标签: java

我找到了下一个代码:

public static void main(String args[]) {
        Producer producer = new Producer();
        producer.start();
        new Consumer(producer).start();
    }
}
class Producer extends Thread {
    static final int MAXQUEUE = 5;
    private Vector<String> messages = new Vector<String>();

    public void run() {
        try {
            while (true) {
                putMessage();
                sleep(1000);
            }
        } catch (InterruptedException e) {
        }
    }

    private synchronized void putMessage() throws InterruptedException {

        while (messages.size() == MAXQUEUE)
            wait();
        messages.addElement(new java.util.Date().toString());
        notify();
    }

    public synchronized String getMessage() throws InterruptedException {
        notify();
        while (messages.size() == 0)
            wait();
        String message = (String) messages.firstElement();
        messages.removeElement(message);
        return message;
    }
}

class Consumer extends Thread {
    Producer producer;

    Consumer(Producer p) {
        producer = p;
    }

    public void run() {
        try {
            while (true) {
                String message = producer.getMessage();
                System.out.println("Got message: " + message);
                sleep(2000);
            }
        } catch (InterruptedException e) {
        }
    }

因此,我理解消息传递 - 只是不使用共享资源,并使用像上面的示例引用从一个对象到另一个对象进行通信。我对吗?

2 个答案:

答案 0 :(得分:1)

如果您关注Publish/Subscribe pattern,那么您需要某种消息queue。生产者将消息放入队列,消费者读取队列的消息。

消息传递的要点是您的生产者/消费者不必直接引用彼此,而只是通过队列进行通信。

答案 1 :(得分:0)

为什么要自己写呢?您可以使用现有的Java消息服务(JMS)解决方案,如ActiveMQ。它可以在进程中运行并在对象之间传递消息。