2012-09-12 3 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

의 "업데이트"일부 상태로 :

결과를 반환하고 예외를 throw하는 일이있는 태스크. 구현 자 call이라는 인수가없는 단일 메서드를 정의합니다. 이에서 큐를 복용

, List<Callable<Boolean>> jobs-List<Callable<Void>> jobs을 변경하고 유사하여 call 방법의 수익 유형을 변경합니다. 이를 사용하여 작업 완료 후 반환 된 상태를 확인할 수 있습니다.

+0

안녕하세요 Sujay, 감사합니다. 제안대로 구현했는데 정상적으로 작동합니다. '개인 부울 performJobs (목록 <호출 가능 > 작업) { \t \t 시도 { \t \t \t 부울 jobDone = 거짓; \t \t \t 목록 <미래 > 선물 = service.invokeAll (jobs); (미래 미래 : 미래)에 대한 \t \t \t { \t \t \t \t jobDone =하는 Future.get(); \t \t \t \t if (!jobDone) \t \t \t \t \t return jobDone; \t \t \t} \t \t \t return jobDone; \t \t} 캐치 (예외 전자) { \t \t \t 던져 새로운 IllegalStateException이 (E); \t \t} 마지막으로 { \t \t \t service.shutdown(); \t \t} \t} ' 이것은 저에게 효과적입니다. – Yahiya

4

Callable 결과를 반환 할 수 있습니다. 집행자 서비스에 일자리를 제출하면 미래가 돌아옵니다. get()을 호출하면 Callable이 반환 한 결과가 제공되며 해당 다운로드의 상태가 될 수 있습니다.

null을 반환하는 대신 해당 파일을 다운로드 한 결과를 반환하십시오. 또 다른 방법은 호출 가능 파일간에 공유 스레드 안전 대기열을 사용하고 해당 대기열에 상태를 추가하는 것입니다 (물건을 순환시키는 방법 임). 또한 트릭의이 종류를 사용할 수 있습니다 호출 가능의 자바 독에서 등 UI

관련 문제