2013-01-02 42 views
2

所以我在小應用程序中使用了多線程。在這裏創建一個新線程,在那裏創建一個新線程。新的多線程 - 多線程最具成本效益的方式?

我目前正在研究監視IRC聊天的程序。對於每個有效的命令,它創建一個線程,做一些工作,並將結果輸出到聊天。有時,應用程序將在短時間內獲得10個或更多有效命令,並創建10個或更多線程。應用程序開始真的放慢速度。我讀過創建和關閉線程是非常低效的資源,所以我想改變我的方法。

我有一個想法是創建一些線程(5左右?),總是運行一個方法,我將命令傳遞給隊列在FIFO的基礎上。在我實施這個之前,我想看看是否有更好的東西我應該使用。當然,我不想逃跑並重新發明輪子。

+1

考慮[java線程池](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html) –

+2

'ExecutorService executor = Executors.newFixedThreadPool(5); ' – assylias

回答

6

您可以使用固定大小ExecutorService線程調查。提交每條消息以作爲任務發送,並且它們將作爲有空的線程發送。例如

ExecutorService es = Executors.newFixedThreadPool(5); 

注意:這可能會導致郵件亂序發送,因此您的客戶端應該能夠根據時間戳重新排序郵件。


順便說一句:如果10個命令一次顯着慢,它不是創建線程,這將導致這一點。線程昂貴是的,但並不昂貴。相反,它可能會導致網絡延遲或其他阻塞操作。如果網絡連接不好,您可能需要爲每個客戶端創建qa隊列。

+0

提到'執行者',也許? – fge

+0

我確實有一些需要同步的方法。它真的那些命令,如果一次有很多的話會變慢。這是預料之中的。但如果在處理第11個命令之前調用了其中的10個命令,則需要大約10秒。 (如果這是有道理的) – meriley

+0

@meriley我的工作嘗試確定爲什麼這些命令需要這麼長時間。我希望您可以每秒發送至少50K條聊天消息,理想情況下超過300K/s。 –