Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

程序执行会减慢运行的线程数(Java)

程序执行会减慢运行的线程数(Java),java,multithreading,Java,Multithreading,我在java程序中遇到了一些奇怪的行为。基本上,我有一个要处理的项目列表,我可以选择一次处理一个项目,或者一次处理所有项目(这意味着一次处理3-4个项目)。每个项目需要处理大约10个线程,因此每次处理1个项目=10个线程,每次处理2个=20个线程,每次处理4个=40个线程,以此类推 奇怪的是,如果我只处理一个项目,它会在大约50-150毫秒内完成。但如果我一次处理2个,则每个项目的处理时间会增加到200-300毫秒。每次3个=每个项目300-500毫秒,每次4个=每个项目400-700毫秒,等等

我在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个线程意味着每个线程将并行工作,而不是像看上去那样在队列中工作。

您有多少个CPU内核

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

因此,它使每个线程的工作时间增加了一倍,但它们可能在大约相同的时间内完成(取决于调度程序)

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

然后是硬件线程,一些线程产生或休眠,如果它们正在读/写操作系统,那么当它们被阻塞时,操作系统将运行其他线程,以此类推


这有用吗?

如果能看到一些源代码就好了。 没有它,我只有4个假设:

1) 您还没有完成负载平衡。您应该考虑线程的最佳数量。< /P> 2) 由每个线程执行的工作不能证明设置和启动线程所需的时间是合理的(+上下文切换时间)

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


4) 弱硬件

您的机器的处理器/核心数少于您启动的线程数,因此在大量线程之间进行上下文切换的开销很大。您是否可以使用同步方法?原因可能是线程之间的“冲突”,因为同步方法实际上会降低性能。为每个线程提供自己的方法/参数,然后查看happens@AsierAranbarri:即使他/她不是,负面影响仍然是显著的。他只需要基本上序列化项目处理(一次一个)。平行线!=更好。@SimonTodd使用线程池的好处是什么?@gd1只有当线程是CPU密集型的,并且使用了大量数据,以至于在上下文更改时必须交换大量一级缓存时,开销才会显著。我认为这个问题最好通过“阅读线程是什么”来回答我得到的印象是OP认为它们是神奇的,如果它是慢代码,他肯定至少会描述它。@AlecTeal多线程,你是一个向导吗@AlecTeal“OP”是什么意思?以前从未见过:)@oleg.lukyrych“原始海报”,开始一个帖子的人或在这种情况下提出一个问题的人。@AsierAranbarri我想是的,但在这个问题上演示它是愚蠢的,我的答案就在上面“想象一下,一位孕妇,C.P.U.Core女士,她怀了数量不详的孩子,她计划称他们为Hard、Pog、Ware和Thread。。。“我使用的是Intel core 2 DUO,我认为它有两个内核,2.26 Ghz和2.27 Ghz,我明白你的意思。我刚才提到过,如果您想知道我有哪个CPU,@user2838678准备好后勾选并向上投票?除非我错过了什么:P