の代わりにReentrantLock
を使用する小さなプログラムを作成しました。しかし、プログラムが停止したのは、生成されたアイテムが消費されると、消費スレッドが停止し、再び消費するために再開しないためです。Javaスレッドのプロデューサとコンシューマ
コードスニペット:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Mantou2 {
int id;
public Mantou2(int id) {
this.id = id;
}}
class Basket2 {
final int max = 20;
Mantou2[] ms;
int n;
Lock lock;
Condition full;
Condition empty;
public Basket2() {
ms = new Mantou2[max];
n = 0;
lock = new ReentrantLock();
full = lock.newCondition();
empty = lock.newCondition();
}
public void consume() {
lock.lock();
try {
while (n == 0) {
System.out.println("No Mantou left!");
empty.await();
}
empty.signal();
System.out.println(ms[--n].id + " consumed and " + n + " left");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void produce() {
lock.lock();
try {
while (n == max) {
System.out.println("Inventory is full!");
full.await();
}
full.signal();
ms[n] = new Mantou2(n++);
System.out.println(ms[n - 1].id + " produced and " + n + " left");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}}
class Consumer2 implements Runnable {
Basket2 basket;
public Consumer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.consume();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}
class Producer2 implements Runnable {
Basket2 basket;
public Producer2(Basket2 basket) {
this.basket = basket;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
basket.produce();
try {
Thread.sleep((long) (Math.random() * 300));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}
public class ProducerCustomer2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Basket2 basket = new Basket2();
Producer2 producer = new Producer2(basket);
Consumer2 consumer = new Consumer2(basket);
Thread p = new Thread(producer);
Thread c = new Thread(consumer);
p.start();
c.start();
}}
私はあなたが直面している問題をより具体的にすることができればそれを少しデバッグすべきだと思います。 –
デバッグ方法:https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ –
[BlockingQueue](https://docs.oracle.com/javase/8/docs/) api/java/util/concurrent/BlockingQueue.html)はあなたの人生を楽にします。 –