我试图解决Euler Project。要点here。是的,我明白了,没有使用算法 - 我没有尝试。问题是,第二个文件使用ExecutorService
来查找值 - 我知道结果不正确但与单线程文件相比,它正在抓取。我认为创建线程本身可能会有开销,将池大小减少到4(我有一个八核处理器)但是没有做任何事情。
早些时候我还使用similar approach 来显着加快使用多个线程生成缩略图的速度。但我无法理解可能导致这种特殊情况缓慢的原因。我不是想要得到正确的解决方案 - 我明白我应该先做,然后尝试其他任何事情。我做错了什么我不是故意找到问题的解决方案来到这里,但我想理解为什么它很慢。我使用了Threads访问的static
个变量。这可能是一个问题吗?
答案 0 :(得分:2)
我知道结果不正确,但与单线程
相比,它是爬行的我执行5-6分钟后杀死程序,因为它运行得很慢
首先,我假设您使用的是Executors.newFixedThreadPool()
,它分配了固定数量的线程,不是缓存的线程池。
在我看来,你可能正在创造大量的工作,而你的程序正在耗尽内存。当你填满内存时,JVM在GC上的工作越来越难,因为你的进程越来越慢。您可以使用jconsole连接到应用程序以验证线程数和内存。你也可以在它上面做一个线程转储(kill -QUIT pid
),看看你分叉了多少个工作。
如果你 创建了大量的工作而你的ExecutorService
无法跟上,那么你需要限制工作量。有几种不同的方法可以做到这一点。这是我使用的:
从那里结合其他解决方案。
我认为创建线程本身可能会有开销,将池大小减少到4(我有一个八核处理器),但这没有做任何事情。
是的,这似乎不是处理器问题。我会将其移回8.如果这确实使该框无法使用,请在ExecutorService
中尝试7或6个线程。
修改强>
在更多地查看代码之后,您正在进行一系列不同步的数据更新,这将导致奇怪的结果。无论何时修改共享内存(在您的情况下为共享static
字段),您都必须在互斥(++
)和内存共享方面进行一些同步。
如果可以的话,我会考虑使用AtomicLong
和其他人,但你应该阅读一些关于共享内存和同步的线程教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html