2012-03-15 49 views
1

任何人都可以使用有關爲什麼我們應該使用線程池的示例進行解釋。帶有執行程序的ThreadPools的POC(概念驗證)

從理論上講,我已經知道使用帶有Executors的線程池了。

我已經通過教程的數量了,但我沒有得到有關我們爲什麼要使用線程池任何實際的例子,它可以是的newFixedThreadPool或newCachedThreadPool或newSingleThreadExecutor

在可擴展性和性能方面。

如果有人解釋我關於性能和可伸縮性的例子嗎?

回答

2

首先,檢查我昨天寫的線程池的描述:Android Thread Pool to manage multiple bluetooth handeling threads?(好吧,它是關於android,但它對於經典的java是一樣的)。

我總是看到使用線程池的主要用途是非常好地管理一個非常普遍的問題:生產者 - 消費者。在這種模式下,有人需要不斷髮送工作物品(生產者)由其他人(消費者)處理。工作項目是從一些類似流的源獲得的,例如套接字,數據庫或磁盤文件集合,並且需要多個工作人員才能進行高效處理。這裏的主要成分識別爲:

  • 生產者:即採取從隊列中的作業,並執行它們
  • 工作線程:即不斷髮布職位信息
  • 其中作業發佈
  • 消費者隊列中的線程

除此之外,需要採用同步才能使所有這些工作正常工作,因爲在沒有同步的情況下讀取和寫入隊列可能會導致數據損壞和不一致。此外,我們需要使系統高效,因爲消費者不應該浪費CPU週期而無需執行任何操作。

現在這種模式非常普遍,但要從頭開始實施它需要付出相當大的努力,這很容易出錯,需要仔細審查。

解決方案是線程池。它非常方便地管理工作隊列,消費者線程和所有需要的同步。所有你需要做的就是扮演製片人的角色,並向任務池提供任務!

1

我會從一個問題開始,然後嘗試爲它找到一個解決方案。

如果您開始採用這種方式,您可以找一個解決方案尋找解決問題的方法,並且您可能會不恰當地使用它。

如果您不能想到線程池的用法,請不要使用它們。 ;)

人們犯的一個常見錯誤是假設因爲他們現在有很多cpus,他們必須全部使用它們,就好像這本身就是一個原因。它就像說我有很多磁盤空間,我必須找到一種方法來使用它。

一個很好的理由使用線程池是如果你有一個忙CPU結合的提高CPU邊界工藝的性能和IO綁定過程的簡單性(而不是使用非阻塞IO與一個線程)

執行可以獨立執行的任務的進程,這對於線程池有很好的用例。

注意:線程池通常只有一個線程。這些有特定的靜態工廠。如果你想要一個簡單的後臺工作者,這可能是一個選擇。

注2:一個常見的錯誤是假設一個CPU綁定的任務將在數百或數千個線程上運行得最好。線程的優化數可以是您擁有的核心數或cpus數。一旦所有這些都很忙,你可能會發現額外的線程只會增加開銷。

-1

我用Google搜索「爲什麼使用java線程池」,結果發現:

線程池提供了一個解決線程 生命週期間接成本問題和資源崩潰的問題。

http://www.ibm.com/developerworks/library/j-jtp0730/index.html

的newCachedThreadPool方法創建一個可擴展 線程池的執行者。該執行程序適用於啓動許多短期任務的應用程序。 newSingleThreadExecutor方法創建一次執行單個任務的執行程序。

http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

+0

-1 ..這是死記硬背,不理解 – moodywoody 2012-03-15 10:41:52

1

初始化一個新的線程(和它自己的堆棧)是一個代價高昂的操作。

線程池用於通過重用已創建的線程來避免此成本。因此,使用線程池可以獲得更好的性能,然後每次創建新線程。

另請注意,創建的線程在使用後可能需要「刪除」,這會增加垃圾收集的成本及其發生的頻率(因爲內存填充速度更快)。

這個分析只是從性能的角度出發。目前我無法想象使用線程池在可擴展性方面的優勢。