Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 增加线程数量是否会使生产者-消费者问题更快?_Java_Multithreading_Synchronization_Producer Consumer_Blockingqueue - Fatal编程技术网

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吗?)我给出了一个非常笼统的答案,因为我们不能再具体了。如果您正在使用内置的生产者/消费者类并做大量的工作,我不认为移交会成为瓶颈。如果你能给我们提供更多的细节,或者最好是一个简短但完整的程序来演示这个问题,我们可能会提供更多的帮助。