2012-04-05 8 views
0

私は次のコードが見つかりました:私は、メッセージパッシングを理解するようにメッセージパッシングを使用してプロデューサ/コンシューマソリューションを書く方法は?

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) { 
     } 
    } 

は - のみ共有リソースを使用して通信するために、1つのオブジェクトから別の上記のサンプルに関してように使用できません。私は正しい?

+0

:この宿題はhttp://stackoverflow.com/questions/9906356/how-solve-consumer-producer-task-using-semaphores – Gray

+0

ですか?あなたは少なくとも今のところこのトピックに関する幅広い質問をしてきました。 – Gray

+0

いいえ、自己学習です。 – user1074896

答えて

1

あなたがPublish/Subscribe patternに従っているなら、あなたはいくつかの種類のメッセージqueueが必要です。プロデューサはキューにメッセージを配置し、コンシューマはキューのメッセージを読み取ります。

メッセージングのポイントは、あなたの生産者/消費者が直接相互に参照だけキューを介して通信する必要がないことです。この質問に関連し

0

なぜそれを自分で書くのか? ActiveMQのような既存のJava Message Service(JMS)ソリューションを使用できます。インプロセスで実行し、オブジェクト間でメッセージを渡すことができます。

+0

私は主なアイデアを理解したい。これはテストサンプルです。 – user1074896