多线程程序运行速度比单线程程序慢

时间:2014-03-25 19:22:27

标签: java multithreading performance

我试图解决Euler Project。要点here。是的,我明白了,没有使用算法 - 我没有尝试。问题是,第二个文件使用ExecutorService来查找值 - 我知道结果不正确但与单线程文件相比,它正在抓取。我认为创建线程本身可能会有开销,将池大小减少到4(我有一个八核处理器)但是没有做任何事情。

早些时候我还使用similar approach 来显着加快使用多个线程生成缩略图的速度。但我无法理解可能导致这种特殊情况缓慢的原因。我不是想要得到正确的解决方案 - 我明白我应该先做,然后尝试其他任何事情。我做错了什么我不是故意找到问题的解决方案来到这里,但我想理解为什么它很慢。我使用了Threads访问的static个变量。这可能是一个问题吗?

1 个答案:

答案 0 :(得分:2)

  

我知道结果不正确,但与单线程

相比,它是爬行的      

我执行5-6分钟后杀死程序,因为它运行得很慢

首先,我假设您使用的是Executors.newFixedThreadPool(),它分配了固定数量的线程,不是缓存的线程池。

在我看来,你可能正在创造大量的工作,而你的程序正在耗尽内存。当你填满内存时,JVM在GC上的工作越来越难,因为你的进程越来越慢。您可以使用jconsole连接到应用程序以验证线程数和内存。你也可以在它上面做一个线程转储(kill -QUIT pid),看看你分叉了多少个工作。

如果你 创建了大量的工作而你的ExecutorService无法跟上,那么你需要限制工作量。有几种不同的方法可以做到这一点。这是我使用的:

  

Process Large File for HTTP Calls in Java

从那里结合其他解决方案。

  

我认为创建线程本身可能会有开销,将池大小减少到4(我有一个八核处理器),但这没有做任何事情。

是的,这似乎不是处理器问题。我会将其移回8.如果这确实使该框无法使用,请在ExecutorService中尝试7或6个线程。

修改

在更多地查看代码之后,您正在进行一系列不同步的数据更新,这将导致奇怪的结果。无论何时修改共享内存(在您的情况下为共享static字段),您都必须在互斥(++)和内存共享方面进行一些同步。

如果可以的话,我会考虑使用AtomicLong和其他人,但你应该阅读一些关于共享内存和同步的线程教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html