2012-09-12 73 views
-1

我正嘗試使用ExecutorService並行地下載文件來實現多線程。以下是我的代碼java中的多線程文件下載

public void downloadFiles(List<String> filenames, final String fileSavePath) { 
    if (filenames != null && filenames.size() > 0) { 
     List<Callable<Void>> jobs = new ArrayList(); 
     for (final String fileName : filenames) { 
      jobs.add(new Callable() { 
       public Void call() throws Exception { 
        downloadFile(fileName, fileSavePath); 
        return null; 
       } 
      }); 
     } 
     performJobs(jobs); 
    } 
} 

我的要求是,我想要在所有文件下載成功後從此方法返回狀態。我不知道如何做到這一點。我無法從外部類訪問內部類的變量。

任何意見將是明顯的。

謝謝

回答

0

狀態從可贖回的的Javadoc:

返回結果並且可能拋出異常的任務。實現者 定義了一個沒有參數調用的單一方法。

考慮從這個線索,改變List<Callable<Void>> jobsList<Callable<Boolean>> jobs,同樣改變你的call方法的返回類型。使用這個,完成任務後,你可以檢查返回的狀態。

+0

嗨Sujay, 感謝我實現了它的建議,它工作正常。 「私人布爾performJobs(列表<可贖回>作業){ \t \t嘗試{ \t \t \t布爾jobDone = FALSE; \t \t \t列表<未來>期貨= service.invokeAll(作業); \t \t \t用於(將來未來:期貨){ \t \t \t \t jobDone =的Future.get(); \t \t \t \t如果(!jobDone) \t \t \t \t \t return jobDone; \t \t \t} \t \t \t return jobDone; \t \t} catch(Exception e){ \t \t \t throw new IllegalStateException(e); \t \t} finally { \t \t \t service.shutdown(); \t \t} \t}' 這適用於我 – Yahiya

4

一個Callable可以返回結果。當你向執行者服務提交工作時,你會回到未來。調用get()就可以得到Callable返回的結果,這很可能是該特定下載的狀態。

而不是返回 null

在你的具體的例子,返回下載文件的結果。另一種方式可以是在可調參數之間使用一個共享的線程安全隊列,並將該狀態添加到該隊列中(儘管這是一種迂迴的做事方式)。您也可以使用這種伎倆來「更新」一些在UI等