I understand that the result will not be correct but it is crawling compared to single threaded one
I kill the program after 5-6 minutes of execution since it is running very slowly
首先,我假设你使用的是Executors.newFixedThreadPool()
其线程分配一个固定的数,不一个缓存的线程池。
在我看来,你可能正在创造一些大量的工作,你的程序内存不足。当你填满内存时,JVM在GC上越来越难以工作,随着你的进程越来越慢,出现这种情况。您可以使用jconsole连接到应用程序以验证线程数和内存。你也可以在它上面做一个线程转储(kill -QUIT pid
),看看你有多少个作业。
如果你的是创造了一些大量的工作,而你的ExecutorService
只是跟不上,那么你将需要扼制工作生产。有几种不同的方法可以做到这一点。这里是我使用的:
Process Large File for HTTP Calls in Java
夫妇从那里链接其他解决方案。
I thought creating threads itself might have overhead reduced the pool size to 4 (I have an eight core processor) but that did nothing.
是的,这似乎不是一个处理器问题。我会将它移回到8.如果这确实使箱子不可用,请在ExecutorService
中尝试7或6个线程。
编辑:
的代码看多后,你做了一堆不同步数据更新的那将会导致奇怪的结果。任何时候你修改共享内存(在你的情况下共享static
字段),那么你将不得不在互斥量(++
)和内存共享方面进行一些同步。
我会考虑使用AtomicLong
和其他人,如果你可以,但你应该读共享内存和同步线程的一些教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
有多长线程中运行?如果他们短命,那么这可能不值得。它们在IO上被阻塞了吗?如果您受CPU限制,您只能看到速度提升。 – Gray
这可能是创建几乎无限数量的Runnables(包括用于负数的)的开销 – immibis
@Gray我正在使用'ExecutorService',所以希望所有线程都应该存在,直到找到一个数字 - 由于运行速度非常缓慢,因此需要执行6分钟。我应该再运行一次吗?但是线程中的调用只能持续1-2个毫秒。 在IO上被阻塞 - 现在我只有一行'System.out.println' - 那还能说明我在检查因子中达到的计数吗?与单线程相比,它的运行速度仍然很慢。 – ykesh