首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者-消费者上的Java多线程

生产者-消费者上的Java多线程
EN

Stack Overflow用户
提问于 2013-04-05 15:00:01
回答 6查看 1.6K关注 0票数 5

我正在看一个关于Java多线程的视频教程。介绍了用Java实现著名的“生产者-消费者”问题。

它使用wait()和notifyAll()来确保生产者线程和消费者线程之间的正确通信。

这位导师故意创建了几个生产者线程,而只有一个消费者线程,但他留下了一个未回答的问题:“最好是生产者线程和消费者线程的数量相等,如果生产者线程比消费者线程多,就会有问题”。

然而,他没有具体说明问题是什么。我个人认为这只是一种篮子满了的情况。专家们能在这方面提供帮助吗?谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-05 15:05:35

你可以有任意数量的生产者和任意数量的消费者。

如果生产者的生产速度太快,队列就会被填满,直到你的内存出现问题,或者生产者被迫保持空闲状态,直到队列中有剩余的位置。

如果消费者消费太快,他们大部分时间都会闲置。

票数 6
EN

Stack Overflow用户

发布于 2013-04-05 15:14:30

拥有相同数量的生产者线程和消费者线程始终是最佳实践

我个人不同意这一点。

有多少生产者和怎样的消费者线程完全取决于情况。对于这一点,没有直接的规则。

我会告诉你我的情况

我们有一个程序,它读取CSV文件,从它创建XML,并将这些XML发布到JMS队列上。这个程序一开始是单线程的,但是性能没有达到mark.We发现发布消息到队列占用了大量的time.So,所以我们决定引入多线程。

我们把逻辑分成两个线程-

  1. ProducerReads CSV并创建XML
  2. 消费者

将XML发送到JMS队列。

我们决定只有一个生产者,因为我们不想为文件打开多个句柄,尽管这是可能的。另一方面,我们保持要创建的消费者线程的数量是可配置的,它工作得很好,我们获得了预期的性能提升。

总之,你需要确保生产者线程和消费者线程的速度几乎是matching.Otherwise如果消费者线程比生产者线程慢,记录将堆积在内存中,这在极端情况下会导致OutOfMemory。

票数 2
EN

Stack Overflow用户

发布于 2013-04-05 15:04:55

除了生产者效率的问题之外,我看不到任何问题。如果你有比消费者更多的生产者,并且他们都以相同的速度生产/消费,那么额外的生产者实际上将处于闲置状态。

例如,请参阅What's best value for make -j,其中建议您将n+1作业分配给n内核,以便它们始终处于满载状态。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15827738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档