2011-09-26 13 views
3

javaのプロデューサ - コンシューマの問題に似たアプリケーションを開発する必要があります。Javaのプロデューサコンシューマに似たアプリケーションを開発するにはどうすればよいですか?

しかし、私はJavaについてよく知らないし、いくつか質問があります。

異なるスレッドであり、どちらも同じバッファにアクセスする必要があるプロデューサとコンシューマの両方です。それらが両方とも異なるクラス(スレッドクラスを拡張するか、実行可能なインタフェースを実装する)であれば、まったく同じバッファを使用するようにそれらをコーディングするにはどうすればよいでしょうか(このバッファは特定のオブジェクトの配列です)。

また、全体的なアーキテクチャとその実装方法についていくつかの提案をお読みしたいと思います。 2つのスレッドが同じバッファ位置を同時に消費しないように、コードを作成する必要があります。2つのプロデューサスレッドが同じ時刻に同じ値を同時に挿入しないようにするには、プロデューサは新しいアイテムをバッファが空のときには消費者が消費しないようにする必要があります。

この例では、複数のコンシューマといくつかのプロデューサが同時に動作している必要があります。

私はJavaでいくつかの例を探しましたが、私は必要なものすべてが異なっています。

答えて

4

コンストラクタに渡すことで、コンシューマとプロデューサの両方に配列またはリストの同じインスタンスを渡すことができます。

Array a = new Array(); 
Consumer c = new Consumer(a); 
Producer p = new Producer(a); 

2番目の質問では、Javaでの同期のために(google it!)を学びたいと思います。 private Object lock1 = new Object();を消費者とプロデューサの両方に再度渡すことができ、共有ロックとして使用できます。

http://download.oracle.com/javase/tutorial/essential/concurrency/locksync.html

消費者や生産者が共有アレイにアクセスするたびに、彼らは最初のロックを取得する必要があります。 「配列が満杯のときに要素を挿入しない」や「配列が空のときに要素を消費しない」などの条件付き要件は、synchronizedブロック内で実装できます。

public void add(Object someObject){ 
    synchronized (lock1) { 
     if(a.size()>limit) { 
      System.out.println("Array is full"); 
     } else { 
      a.add(someObject) 
     } 
    } 
} 
3

が実際にJavaのコアライブラリ(バージョン1.5以上)で、データ構造はjava.util.concurrentパッケージあなたのneeds.Underを満たすために既に存在している、BlockedQueue、LinkedBlockedQueue..etcは使用して同時のすべてです。

+0

これはBlockingQueueとLinkedBlockingQueueになります。 – Friek

関連する問題