2011-12-02 123 views
0

我有Java應用程序,它運行線程爲每個線程執行N次任務,並且可以設置線程編號。 每個線程的每個作業迭代需要20秒到1-1.5分鐘。每個線程必須爲該作業做大約25000-100000次迭代。 因此,以前添加的作業有更多的「完成作業」,他們有更高的優先級(如我認爲的JVM,但優先級不設置,他們有同樣的優先programmly)。但是在添加一些新任務之後,我需要線程均勻地完成任務。 比如有5000個線程100000次反覆做100個就業機會:多線程性能

  • 舊作業#1做
  • 老#2任務做
  • ...
  • 舊工作#100做它

但是,當我添加例如工作#101,然後我會看到,線程不會像第一份工作一樣快地運行。 我已經使用yield()和sleep(50),但它似乎不是很好的結果。 那麼你能告訴我我做錯了什麼,以及如何爲太多的線程做出卓越的性能?

+0

大約有多少個線程同時運行? – millimoose

+0

你有多少個核心?您可能會發現線程的最佳數量等於您擁有的核心數量。 –

+0

@Inddial大約10000-20000。 – purple

回答

1

很難告訴你你做錯了什麼(如果有的話),因爲你沒有告訴我們有關你如何完全實現這一點的任何事情。

您可能想要使用ExecutorService(線程池),該線程池可以通過多個線程自動爲您分配作業。請參閱Oracle Java教程中的Executor Interfaces

您沒有告訴我們關於程序正在做什麼的任何信息,但如果問題適合該問題,那麼Java 7 Fork/Join framework可能會有用。

+0

當然,我寫網絡綁定應用程序通過網絡檢查一些數據。我已經在使用ExecutorService。 – purple

2

線程由OS調度程序調度,您不能指望它們按照這樣的固定順序執行。只有每個線程都應該有一些來自調度程序的分配時間。如果任務與其他任務無關,則無論如何您都不應該關心訂單。如果他們不是獨立的,那麼你應該讓他們合作,確保一切都按照適當的順序執行。

擁有5000個線程可能太多了。你的機器有多少個處理器?線程執行的任務是什麼?如果它們是CPU限制的,那麼最好的辦法是讓一些線程的數量等於處理器的數量,或者等於處理器的數量+ 1.

+0

我正在使用8個處理器。這些線程不受CPU限制,它們完全是網絡綁定的。 – purple

+1

如果瓶頸不是CPU,而是網絡,則需要監視網絡帶寬。你如何使用你的CPU不太可能發生問題。 –