生产者消费者问题:如何让多个消费者同时参与消费?

生产者消费者问题:如何让多个消费者同时参与消费?

生产者与消费者问题:单个生产者,多个消费者,但仅有单一消费者参与消费

在生产者与消费者问题中,您还引入了多个消费者线程。然而,您遇到的问题是,尽管有多个消费者,但只有一个消费者参与消费。

问题出在 wait 和 notifyall 方法上。wait 方法只能由持有目标对象锁的线程调用,并且 notifyall 只会唤醒由该锁调用 wait 的线程。

在这个例子中,当消费者线程获取列表锁并调用 wait 时,生产者线程可以获取该锁并生产新元素。然后,生产者调用 notifyall,它只会唤醒持有列表锁的线程(即消费者 1)。

当消费者 1 消费该元素并释放锁时,消费者 2 就没有机会获取该锁并调用 wait。因此,每次生产者生产新元素时,只有消费者 1 能够消费它。

要解决此问题,您可以在 wait 方法中使用 while 循环,直到列表为空才释放锁。这样,多个消费者线程就有机会在每个生产者周期内获取锁并消费元素。修改后的代码如下:

while (true) {
    synchronized (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();
    }
}

以上就是生产者消费者问题:如何让多个消费者同时参与消费?的详细内容,更多请关注www.sxiaw.com其它相关文章!