Java 增加线程数量是否会使生产者-消费者问题更快?
我使用一个无界链接阻塞队列实现了类似于消费者-生产者问题的东西。我让生产者将对象放入队列,消费者将其接收。当我测试程序时,在处理相同数量的对象的同时,将每次测试的线程数量加倍,所有测试的时间似乎是恒定的。假设它是常数吗?或者更多线程意味着更快的处理?不确定是我的代码导致了共享资源的缓慢或同步。有什么想法吗?这完全取决于瓶颈是什么:Java 增加线程数量是否会使生产者-消费者问题更快?,java,multithreading,synchronization,producer-consumer,blockingqueue,Java,Multithreading,Synchronization,Producer Consumer,Blockingqueue,我使用一个无界链接阻塞队列实现了类似于消费者-生产者问题的东西。我让生产者将对象放入队列,消费者将其接收。当我测试程序时,在处理相同数量的对象的同时,将每次测试的线程数量加倍,所有测试的时间似乎是恒定的。假设它是常数吗?或者更多线程意味着更快的处理?不确定是我的代码导致了共享资源的缓慢或同步。有什么想法吗?这完全取决于瓶颈是什么: 如果消费者处理这些元素的速度与生产者生产的速度一样快,那么增加更多的消费者将无济于事 如果消费者是瓶颈,那么增加更多的生产者只会意味着你积压了大量的工作 如果消费者
- 如果消费者处理这些元素的速度与生产者生产的速度一样快,那么增加更多的消费者将无济于事
- 如果消费者是瓶颈,那么增加更多的生产者只会意味着你积压了大量的工作
- 如果消费者都共享一个已经耗尽的资源(例如饱和的网络连接或磁盘),那么添加更多线程将无济于事
- 如果使用者在共享资源上进行同步,这迫使他们在很大一部分时间内以串行方式工作,那么添加更多线程将无济于事
- 如果消费者是CPU受限的,并且您已经有足够的线程来最大化您的CPU使用率,那么添加更多线程将没有帮助
- 您的工作队列长度是多少?它只是在继续增长吗?它总是接近0吗
- 您的CPU使用情况如何?网络/磁盘使用情况如何
然后分析您的代码正在做什么,并计算出您预期的问题是可并行化的程度可能是您的同步。假设您的单个队列一次只消耗一个项目,在您消费或生产时阻止其他消费者,那么如果您想要更大的吞吐量,您需要更多的队列。这是一种组合,您必须尝试找到接近最优的解决方案。让我们从单核系统开始。在这里,您必须找到等待中的余额(通常是IO)和计算时间。你可以根据你正在做的事情使两者饱和。例如,如果您受到磁盘速度的限制,则无法通过添加更多线程获得任何收益。相反,您可能会打乱磁盘调度,性能会下降。另一方面,如果您从不等待IO,那么您的工作就处于另一个极端,在单核处理器上添加更多线程不会带来任何好处
在多核系统上,只要不等待IO,就可以增加线程数以提高性能。更多的内核在这方面帮不了你。但与IO一样,添加线程也会有开销,所以不要太高。这不是最后两个。为了模拟目的,消费者和生产者在添加/删除后睡眠2毫秒。我想这可能是第一次。但是既然put/take是同步的,这难道不是一个瓶颈吗?@Dan:你还没有给我们提供足够的信息来说明你是如何实现这一点的,或者消费者/生产者在做什么。(他们只是在等2ms吗?)我给出了一个非常笼统的答案,因为我们不能再具体了。如果您正在使用内置的生产者/消费者类并做大量的工作,我不认为移交会成为瓶颈。如果你能给我们提供更多的细节,或者最好是一个简短但完整的程序来演示这个问题,我们可能会提供更多的帮助。