2012-01-04 128 views
1

我正在嘗試處理多個文件寫入命令(單獨文件)而不掛用戶界面。多個文件寫入線程

擺在上下文我的問題,設想以下

  1. 我主要的應用程序看起來像一個文件管理器。目前它有10個文件,每個文件大小約爲5MB。 (不要擔心這個列表如何工作等)

  2. 當我選擇一個文件項目時,我希望它立即開始將文件複製/複製到SD卡上的另一個位置。通常,這應該會持續幾秒鐘

  3. 我希望能夠選擇第二或第一之後,第三等立即文件。在所有內容結束時,我選擇的所有文件都將被複制。所以我可以在5秒內點擊5個文件,但所有的複製操作都需要一分鐘。

這時兩個選項都來我的腦海:

首先是簡單地把每個文件的文件寫入命令在一個單獨的線程。僞代碼看起來像這樣

Onclick 
    new Thread() 
     write file 

如果一切正常,可以有場景在那裏我有10個線程同時運行,寫入10個單獨的文件。我想知道是否有人以前做過這件事,我應該尋找什麼

第二種選擇當然是,如果已經有一定的數據結構/已知的方法可以解決這個問題。某種掛起的隊列系統在我添加請求時變大,但隨着系統寫入數據而變小。

+0

必須通過[多線程對性能(http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html)看看。更具體地說,**處理併發**部分。 – 2012-01-04 19:48:55

回答

1

我沒有絕對的把握如何在SD卡的作品,但我可以告訴你,試着寫在與單個硬盤並行是一個壞主意,因爲與順序寫入相比,它實際上會降低性能。

您可能想嘗試使用ExecutorService並使用不同的線程計數來衡量性能,但是恐怕最終必須使用單個線程實現一個隊列,將排隊的文件逐個寫入。

+2

並行寫入硬盤驅動器的原因是因爲讀/寫頭必須保持移動到不同的部分的驅動器。 SD卡沒有移動部件(至少沒有超過原子尺寸)。這並不是說並行寫入SD卡不會減慢速度(我不知道這種或那種方式);只是如果他們這樣做,這是一個與硬盤無關的理由。 – 2012-01-05 03:15:58

0

我會創建一個AsyncTask類,它只是將給定的文件複製過來。每次選擇文件時,爲所選文件創建該類的新實例。內置於Android for AsyncTask的線程管理平衡良好,應該很好地處理這種用例。使用內置的AsyncTask方法可以輕鬆提供進度和完成的反饋。

0

我想java.util.concurrent中的類是你所需要的;特別是Executors類創建一個ThreadPoolEecutor。它具有接受用戶點擊的儘可能多的任務的好處,但將線程數量限制爲您指定的某個限制。 (產卵線程無限制可能是一個問題,放緩不僅對方,但用戶界面也是如此。)

+0

對於一個SD卡,線程數量的最大限制是1. – 2012-01-04 20:05:41

+0

@MartinJames - 這可能是最好的,但我會建議分析而不是做出這樣的假設。例如,Android從3.0開始支持多核處理器,並且誰知道,可能有SD卡(以及插入它們的設備)支持多個數據路徑。 – 2012-01-04 22:09:09

+0

上面的@Tudor也提出,並行寫入SD卡可能會違反直覺。就我個人而言,我還喜歡將事情保持在單個線程(在本例中爲main +執行程序線程),而不是具有我無法跟蹤的多個線程。 感謝您的輸入,我將用ExecutorService.newSingleThreadExecutor()來試用它,看看它是怎麼回事 – 2012-01-05 03:02:48