2017-08-07 83 views
0

假設一個java應用程序有它自己的線程池來支持併發任務執行,並且總共有500個線程被分配給它。 Tomcat還配置爲通過連接器配置支持總共1000個線程。應用程序級線程池和tomcat

1000個線程的連接器配置是否充當500個線程應用程序線程池的超集或是這兩個獨立的線程池?這是否意味着共有1000個線程被分配給已部署的應用程序,還是500 + 1000 = 1500?

回答

0

當您將連接器配置爲具有最多1000個線程時,連接器將最多有1000個線程。它不會檢查同一虛擬機中可能有多少線程處於活動狀態。

你沒有說明你如何分配你的自定義線程池,但我從來沒有遇到過一個線程池,它將允許的線程數與系統中正在發生的其他線程相關聯(除了耗盡的記憶)。

你回答的原因是1500那麼。

它也很容易找到:只需將系統置於應該使用1000個線程處理的負載下並導致線程轉儲。當您使用1000個線程配置連接器時,顯然是這樣做的,因爲您已經測量出您處理的卷的尺寸合適,這意味着您有負載測試,可以輕鬆生成該負載。

而不是產生所有這些線程,我想建議調查java.util.concurrent.Executor及其親屬。

+0

我只使用java.util.concurrent庫來創建和使用自定義線程池。 –

0

Java的後臺線程池實際上被基本庫的某些部分重新使用。因此,例如,如果您運行一個並行化的流,則完全相同的線程池將用於所有這些流。

由於超出了我的理由,Apache軟件傾向於複製基本Java庫,這意味着Tomcat使用自己版本的線程池,該線程池與基本庫線程池沒有任何兼容或重新使用。

實際上,如果運行500個Java基本庫線程池線程和1000個Tomcat線程,那麼您正在運行1500個線程。如果考慮到線程切換花費很小,那麼擁有如此多的活動線程會導致系統在線程處理上花費大量時間,而不是執行實際的代碼。多少完全取決於內部和負載,但是對於你描述的情況的一個有根據的猜測是線程切換浪費CPU時間的5-15%左右。