生产者消费者问题:多个消费者中只有一个参与消费
在生产者消费者模式中,尽管存在多个消费者线程,但程序中仅有一个消费者参与消费,违背了预期。
问题原因
此问题根源在于 wait() 和 notifyall() 方法的机制。只有持有锁才能调用 wait() 方法,而 notifyall() 只能唤醒由该锁调用 wait() 方法而处于等待状态的线程。
程序执行流程
解决方案
为了让所有消费者都有机会参与消费,需要修改程序逻辑,确保在消费者线程释放锁之前,唤醒所有等待线程。
修改后的代码如下:
class ConThread extends Thread {
private List list;
public ConThread(List list) {
this.list = list;
}
@Override
public void run() {
while (true) {
synchr
onized (list) {
if (list.size() == 0) {
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Object object = list.remove(0);
System.out.println(Thread.currentThread().getName() + "消费 list" + object);
// 释放锁后再唤醒所有等待线程
list.notifyAll();
}
}
}
}