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

ID:16989 / 打印

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

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

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

问题出在 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();     } }
上一篇: 为什么整型最小负数的绝对值比最大正数大 1?
下一篇: 软件开发公司如何通过保密协议保护机密信息?

作者:admin @ 24资源网   2024-11-27

本站所有软件、源码、文章均有网友提供,如有侵权联系308410122@qq.com

与本文相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。