程序执行会减慢我运行的线程越多(Java)

时间:2013-10-03 11:07:22

标签: java multithreading

我在java程序中遇到了一些奇怪的行为。基本上,我有一个要处理的项目列表,我可以选择一次处理一个项目,或者一次处理所有项目(这意味着每次3-4个)。每个项目需要处理大约10个线程,因此每次处理1个项目= 10个线程,一次处理2个线程= 20个线程,每次4个线程,等等。

这是奇怪的事情,如果我只处理一个项目,它在大约50-150毫秒内完成。但是如果我一次处理2个,那么每个项目的处理速度可达200​​-300毫秒。每次3件=每件300-500MS,每件4件=每件400-700 MS等。

为什么会这样?我之前做过的研究表明,jvm可以轻松处理多达3000-4000个线程,那么为什么我只需要30-40个线程就可以减速呢?这是正常的行为吗?我认为拥有40个线程意味着每个线程都可以并行工作,而不是像现在这样在队列中工作。

2 个答案:

答案 0 :(得分:3)

你有多少个CPU内核?

如果我有一个CPU核心,并且我最大化了一个单独的线程应用程序,那么CPU总是很忙,如果我给它两个线程,两个都做这个繁重的任务,我没有得到双重CPU,不,它们都得到~0.5秒/秒(秒/秒)的CPU时间,占用了操作系统切换线程所需的时间。

所以它使每个线程工作所用的时间加倍,但它们可能在大约相同的时间完成(取决于调度程序)

如果你有两个CPU内核....那么它(理论上再次)在一个线程的同时完成,因为一个线程不能使用两个cpu内核(同时)

然后是硬件线程,一些线程产生或休眠,如果他们正在读/写操作系统将在阻塞时运行其他线程,等等......

这有帮助吗?

答案 1 :(得分:0)

看到一些源代码会很高兴。 没有它,我只有4个假设:

1)您尚未完成负载平衡。您应该考虑最佳线程数。

2)由每个线程执行的工作不能证明设置和启动线程所需的时间(+上下文切换时间)。

3)您的代码质量存在实际问题

4)硬件不足

相关问题