2010-08-22 59 views
0

我創建了一個大小爲1000的數組對象,它們都是線程的,這意味着添加了1000個線程。每個對象擁有一個套接字和9個更多的全局變量。整個對象由1000行代碼組成。Java線程對象

我正在尋找使程序高​​效的方法,因爲它滯後。每次啓動程序時,CPU使用率都爲100%。

我知道我將不得不改變程序的工作方式,但我找不到一個好方法。任何人都可以解釋如何做到這一點?

+2

我認爲短語「1000線程」和「CPU使用率爲100%」一起走得很好。您可能需要重新考慮您的設計... – Starkey 2010-08-22 22:17:41

回答

0

1 /使用線程池

2 /利用期貨

+0

線程池+1,但期貨爲-1。期貨在這裏沒有幫助.. – 2010-08-22 23:42:03

+0

好笑。期貨確實幫了很大忙。大多數情況下,可以通過定期執行的動作序列來替換多個線程,這裏的期貨和適當的執行者即將到來。 – Moisei 2010-08-24 00:24:34

3

這取決於你的線程實際上做 - 是的任務主要使用CPU或其他資源?對於CPU密集型任務,最好的策略是運行與核心一樣多的線程,或者更多。對於例如阻塞很多的線程,讀取文件,等待網絡等等,你可以擁有比CPU更多的線程。

它也取決於系統有多少個核心。顯然,單個處理器機器的答案與128路多處理器的答案不同。上述經驗法則可以給你一些估計值,但最好基於這些來做實驗,找出理想的特定設置的線程數。

此外,自Java5以來,總是建議使用例如一個ThreadPoolExecutor而不是手動創建你的線程。這使您的應用更健壯,更靈活。

0

你應該考慮重構你對線程的使用。

1000雖然您的問題似乎是I/O繁重,但在正常的機器/服務器上,線程通常沒有意義。您應該考慮可用的cpu線程數。

一個可能的解決方案是使用一個調度程序,它將套接字上的請求的處理(可能是響應)傳遞到ThreadPoolExecutor的隊列中。

0

從我的經驗來看,1000個線程太多了(至少在8核/ 8GB內存的機器上)。一個常見的症狀是上下文切換斜槓,其中您的操作系統正忙於從一個線程跳到另一個線程,同時做一些有用的工作(並浪費大量內存等)。

如果您必須維護 1000個套接字,您可能必須去NIO。更容易的出路是每次關閉/打開套接字(無論你是否可以依賴於你的工作特徵來做這件事)。

你解決這麼多線程問題的方式是使用線程池,就像其他人注意的那樣。代替擴展線程,代碼是一個Runnable。這說起來容易做起來難,但是因爲如果你需要談話,你必須保持狀態。這通常涉及ConcurrentMap。我個人傾向於在該地圖上放置一個Handler(它實現了Runnable),該地圖應該在對方返回響應時響應(響應每次都包含一個鍵)。在這種情況下,您每次都會關閉套接字。如果您使用NIO,則更像是使用線程進行編碼,因爲您不需要識別此類對手方,但它有其自身的複雜性。