3

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

奇怪的是,如果我只处理一个项目,它会在大约 50-150 毫秒内完成。但是,如果我一次处理 2 个,则每个项目最多需要 200-300 毫秒。一次 3 个 = 每项 300-500 毫秒,一次 4 个 = 每项 400-700 毫秒,依此类推。

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

4

2 回答 2

3

你有多少个 CPU 内核?

如果我有一个 CPU 内核,并且我在其上最大化了一个单线程应用程序,那么 CPU 总是很忙,如果我给它两个线程,都做这个繁重的任务,我不会得到双倍的 CPU,不,他们两者都获得约 0.5 秒/秒(秒/秒)的 CPU 时间,从而消除了操作系统需要切换线程的时间。

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

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

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

这有帮助吗?

于 2013-10-03T11:10:18.790 回答
0

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

1)您还没有完成负载平衡。您应该考虑最佳线程数。

2)工作,每个线程执行的时间不合理,需要设置和启动线程(+上下文切换时间)。

3)您的代码质量存在真正的问题

4)硬件薄弱

于 2013-10-03T11:13:39.387 回答