2016-03-08 24 views
1

我想知道在這個特定場景中使用CachedThreadPoolFixedThreadPool。 當用戶登錄到應用程序。地址列表將獲得約10個地址。我需要做到以下幾點:CachedThreadPool vs FixedThreadPool

  1. 轉換的地址爲緯度和經度,我特意打電話谷歌API
  2. 獲得上述獲取的緯度和經度與用戶的當前位置之間的距離也與谷歌的API的幫助

所以我創建了一個類GetDistance它實現Runnable - 在這個類中,我第一次調用谷歌API和解析resposne得到相應的緯度和經度,然後調用和解析另一個谷歌API來獲取驅動的結果距離。

private void getDistanceOfAllAddresses(List<Items> itemsList) { 
    ExecutorService exService = newCachedThreadPool(); //Executors.newFixedThreadPool(3); 
    for(int i =0; i<itemsList.size(); i++) { 
     exService.submit(new GetDistance(i,usersCurrentLocation)); 
    } 
    exService.shutdown(); 

} 

我試圖與這兩個CachedThreadPoolFixedThreadPool - 所用的時間幾乎是一樣的我也很贊成CachedThreadPool的,因爲它被推薦用於小規模行動,但我關心的是 - 讓我們假設CachedThreadPool創建10個線程(最壞情況)來完成這個過程(10個項目),如果我的應用程序運行在低端設備上,這會是一個問題嗎?由於創建的線程數量也會影響設備的RAM。

想知道你的想法和意見。哪個更好用?

感謝

回答

2

圍棋與newCachedThreadPool它是更適合這種情況,因爲你的任務是小型和I/O(網絡)的約束。這意味着你應該創建比處理器內核數量更多的線程(通常是1.5倍〜2倍)以獲得最佳輸出,但在這裏我猜想newCachedThreadPool將自行管理。因此,與newFixedThreadPool相比,newCachedThreadPool的開銷將較少,並且會對您的情況有所幫助。

如果你有CPU密集型任務,那麼newFixedThreadPool可能是一個更好的選擇。


更新

地址列表將獲得約10個地址。

如果你總是隻需要10個地址,那麼沒關係,用newCachedThreadPool就行。但是如果你認爲地址的數量可以增加,那麼使用newFixedThreadPool和線程數量< = 1.5倍到2x倍的可用內核數量。


從Java文檔:

newFixedThreadPool

創建一個可重用 不受限制的隊列操作線程的 固定數目的線程池。在任何 點,最多nThreads線程將 是活動的處理任務。如果 當 所有線程都處於活動狀態,則會提交其他任務,它們將在隊列中等待 ,直到線程爲 可用。如果由於執行 在關閉之前發生故障而導致任何線程終止 ,則在需要執行 後續任務時,新執行線程將佔用 它的位置。 池中的線程將一直存在,直到明確地關閉 。

newCachedThreadPool

創建一個可根據需要創建新 線程的線程池,但將重用 以前構造的線程時 它們是可用的。這些池 通常會提高執行許多短暫異步作業的 程序的性能。如果可用,調用執行 將重新使用先前構造的 線程。如果沒有現有的 線程可用,則會創建一個新線程 並將其添加到池中。 終止60秒並未使用 的線程,並從緩存中刪除 。因此,保持空閒時間足夠長的池 將不消耗任何資源。請注意,使用ThreadPoolExecutor構造函數可以創建 具有類似屬性但具有 不同細節(例如, 超時參數)的池 。

+0

感謝我正在尋找的東西。 – ik024

+0

好的和準確的答案 – Androider

+0

線程數量多於處理器內核數量可能會導致更好的性能如何? – whomaniac

相關問題