2010-12-06 44 views
2

我正在負載測試一個jboss消息傳遞安裝與5個生產者產生100,000 100k消息。我看到了重大的瓶頸。當我監視分析器時,我看到有15個線程名爲WorkerThread#。這些線程被分配100%而不等待。我認爲他們可能有關係。有誰知道這些線程服務的功能是否有線程池設置。我使用的是人聯黨Jboss Messaging WorkerThread#這些線程是什麼?

JBoss企業應用服務器4.3 CP08
JBoss企業服務總線4.4 CP04
JBoss的交易4.2.3._CP07
的JBoss Messaging 1.4.0.SP3-CP09
的JBoss 4.0.7規則
的JBoss jBPM的3.2.9
的JBoss Web服務2.0.1.SP2_CP07

+0

如果您生產100,000條每條100k的消息,爲什麼您會驚訝於您有幾條線程全速工作?當然這是一件好事。 – skaffman 2010-12-06 22:22:41

+0

當然。但是我的硬件並不是一成不變的。這必須是一個池,因爲當服務器閒置時,0%分配中只有3個,然後以100%跳轉到15。然後,我的迴應時間就下降了。看起來像我可能只是在游泳池裏。我想用游泳池中的更多線程運行一些bencmarks。 – nsfyn55 2010-12-07 15:53:33

回答

2

我已經想通了。它不是一個線程池。在爲Jboss Messaging定義遠程連接的jboss-messaging.sar/remoting-bisocket.xml文件中,您會看到一些值主要是clientMaxPool,maxPoolSize和numAcceptThreads。

在遠程處理中,當套接字建立時,將創建線程以監視該套接字,最大值爲「numAcceptThreads」。所有這些線程都會從套接字中讀取數據並將其傳遞給客戶端池中的線程(由maxPoolSize控制)。

稱爲workerThread#[]的線程引用接受線程。當我創建更多製作人時,我看到更多的原因是因爲對於Jboss Messaging的雙向傳輸,顯然有三個套接字創建。最初有3個,但是當我創建5個生產者時,這個數字會增加到15(對於那些沒有數學傾向的人來說,這個數字是5 * 3))。他們100%分配的原因是因爲當我發送所有這些消息時,線程從套接字讀取數據,切換到服務器線程,返回從套接字讀取數據(總是數據)

因此,答案是沒有池來管理這些線程。你可以有超過1個接受線程,但它幾乎沒有意義。這是因爲它的工作非常簡單,只需讀取數據,交出數據,讀取數據......因此,更多的線程只會增加同步開銷。

-1

這是http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html;希望能幫助到你。

當Swing程序需要執行長時間運行的任務時,它通常使用其中一個工作線程,也稱爲後臺線程。運行在工作線程上的每個任務都由javax.swing.SwingWorker的實例表示。 SwingWorker本身是一個抽象類,您必須定義一個子類才能創建SwingWorker對象;匿名內部類通常用於創建非常簡單的SwingWorker對象。