Javaでは、以下のコードを使用して単純なwaitおよびnotifyAll()メソッドを使用してプロデューサーとコンシューマーの実装を記述しようとしていました。数秒間実行され、後でハングします。これを解決する方法を考えてみてください。
import java.util.ArrayDeque;
import java.util.Queue;
public class Prod_consumer {
static Queue<String> q = new ArrayDeque(10);
static class Producer implements Runnable {
public void run() {
while (true) {
if (q.size() == 10) {
synchronized (q) {
try {
System.out.println("Q is full so waiting");
q.wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
}
synchronized (q) {
String st = System.currentTimeMillis() + "";
q.add(st);
q.notifyAll();
}
}
}
}
static class Consumer implements Runnable {
public void run() {
while (true) {
if (q.isEmpty()) {
synchronized(q) {
try {
System.out.println("Q is empty so waiting ");
q.wait();
}catch(InterruptedException ie) {
ie.printStackTrace();
}
}
}
synchronized(q) {
System.out.println(q.remove());
q.notifyAll();
}
}
}
}
public static void main(String args[]) {
Thread consumer = new Thread(new Consumer());
Thread consumer2 = new Thread(new Consumer());
Thread producer = new Thread(new Producer());
producer.start();
consumer.start();
consumer2.start();
}
}