私はJavaのスレッドに関してプロデューサーとコンシューマーのデザインパターンを調査していましたが、最近Java5で調査しました。Java5でのBlockingQueueデータ構造の導入により、BlockingQueueはブロッキングメソッドを導入することでこの制御を暗黙的に提供するため、はるかに簡単になりました。 put()およびtake()。これで、プロデューサーとコンシューマーの間で通信するために待機と通知を使用する必要がなくなりました。BlockingQueue put()メソッドは、制限付きキューの場合にキューがいっぱいの場合にブロックし、キューが空の場合にtake()がブロックします。次のセクションでは、プロデューサーコンシューマーデザインパターンのコード例を示します。私は以下のプログラムを開発しましたが、waut()とnotify()の古いスタイルのアプローチも教えてください。古いスタイルのアプローチでも同じロジックを開発したいと思います。
皆さんは、これをどのように実装できるかをアドバイスしてください。従来の方法では、wait()メソッドとnotify()メソッドを使用して、プロデューサースレッドとコンシューマースレッドの間で通信し、フルキューや空のキューなどの個別の条件でそれぞれをブロックします...?
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ProducerConsumerPattern {
public static void main(String args[]){
//Creating shared object
BlockingQueue sharedQueue = new LinkedBlockingQueue();
//Creating Producer and Consumer Thread
Thread prodThread = new Thread(new Producer(sharedQueue));
Thread consThread = new Thread(new Consumer(sharedQueue));
//Starting producer and Consumer thread
prodThread.start();
consThread.start();
}
}
//Producer Class in java
class Producer implements Runnable {
private final BlockingQueue sharedQueue;
public Producer(BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
}
@Override
public void run() {
for(int i=0; i<10; i++){
try {
System.out.println("Produced: " + i);
sharedQueue.put(i);
} catch (InterruptedException ex) {
Logger.getLogger(Producer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
//Consumer Class in Java
class Consumer implements Runnable{
private final BlockingQueue sharedQueue;
public Consumer (BlockingQueue sharedQueue) {
this.sharedQueue = sharedQueue;
}
@Override
public void run() {
while(true){
try {
System.out.println("Consumed: "+ sharedQueue.take());
} catch (InterruptedException ex) {
Logger.getLogger(Consumer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
Output:
Produced: 0
Produced: 1
Consumed: 0
Produced: 2
Consumed: 1
Produced: 3
Consumed: 2
Produced: 4
Consumed: 3
Produced: 5
Consumed: 4
Produced: 6
Consumed: 5
Produced: 7
Consumed: 6
Produced: 8
Consumed: 7
Produced: 9
Consumed: 8
Consumed: 9