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