我正在看一个关于Java多线程的视频教程。介绍了用Java实现著名的“生产者-消费者”问题。
它使用wait()和notifyAll()来确保生产者线程和消费者线程之间的正确通信。
这位导师故意创建了几个生产者线程,而只有一个消费者线程,但他留下了一个未回答的问题:“最好是生产者线程和消费者线程的数量相等,如果生产者线程比消费者线程多,就会有问题”。
然而,他没有具体说明问题是什么。我个人认为这只是一种篮子满了的情况。专家们能在这方面提供帮助吗?谢谢。
发布于 2013-04-05 15:05:35
你可以有任意数量的生产者和任意数量的消费者。
如果生产者的生产速度太快,队列就会被填满,直到你的内存出现问题,或者生产者被迫保持空闲状态,直到队列中有剩余的位置。
如果消费者消费太快,他们大部分时间都会闲置。
发布于 2013-04-05 15:14:30
拥有相同数量的生产者线程和消费者线程始终是最佳实践
我个人不同意这一点。
有多少生产者和怎样的消费者线程完全取决于情况。对于这一点,没有直接的规则。
我会告诉你我的情况
我们有一个程序,它读取CSV文件,从它创建XML,并将这些XML发布到JMS队列上。这个程序一开始是单线程的,但是性能没有达到mark.We发现发布消息到队列占用了大量的time.So,所以我们决定引入多线程。
我们把逻辑分成两个线程-
将XML发送到JMS队列。
我们决定只有一个生产者,因为我们不想为文件打开多个句柄,尽管这是可能的。另一方面,我们保持要创建的消费者线程的数量是可配置的,它工作得很好,我们获得了预期的性能提升。
总之,你需要确保生产者线程和消费者线程的速度几乎是matching.Otherwise如果消费者线程比生产者线程慢,记录将堆积在内存中,这在极端情况下会导致OutOfMemory。
发布于 2013-04-05 15:04:55
除了生产者效率的问题之外,我看不到任何问题。如果你有比消费者更多的生产者,并且他们都以相同的速度生产/消费,那么额外的生产者实际上将处于闲置状态。
例如,请参阅What's best value for make -j,其中建议您将n+1作业分配给n内核,以便它们始终处于满载状态。
https://stackoverflow.com/questions/15827738
复制相似问题