2014-03-13 1 views
0

이것은 ExecutorService을 사용하여 한 디렉터리에서 다른 디렉터리로 파일을 복사하는 코드이지만 순차 작업보다 느립니다. FileUtils copyFile 메서드가 동기화되지 않은 아파치를 사용하고 있습니다. 뭐가 문제 야?ExecutorService가 순차 파일 복사 프로세스보다 느림

public class ExecutorService { 

private static java.util.concurrent.ExecutorService pool; 


public ExecutorService() { 

    pool = Executors.newFixedThreadPool(20); 
} 


public static void main(String arg[]) { 

    long a = System.currentTimeMillis(); 

    new ExecutorService(); 

    List<File> listFiles = null; 
    try { 
     listFiles = FileUtility.getFileNamesToExtract(new File(
       "C:/Users/User/Desktop/XSLT Source/Input XML")); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    for (int i = 0; i < listFiles.size(); i++) 
     pool.submit(new FileTransfer(listFiles.get(i), i)); 

    pool.shutdown(); 

    try { 
     pool.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    long b = System.currentTimeMillis(); 
    System.out.println((b - a)/1000); 

    } 

} 

public class FileTransfer implements Runnable{ 

private File file = null; 
private int num = 0; 

public FileTransfer(File file, int i) { 
    this.file = file; 
    this.num = i; 
} 

@Override 
public void run() { 
    try { 
     System.out.println("Processing="+file.getName()); 
     FileUtils.copyFile(file, new File("C:/Users/gursahibsahni/Desktop/thread pool files/"+num+"_"+file.getName()+num)); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } 

} 

답변

4

문제는 무엇입니까?

스레드 풀이 파일 전송을 빠르게 할 수 있다고 생각하는 이유를 정말로 알 수 없습니다. 싱글 스레드 버전을 실행하고 CPU 사용을 모니터하십시오. 내 기대 : 그것은 10 % 이하가 될 것입니다.

파일 복사는 CPU를 많이 사용하는 작업이 아니며 병렬 처리는 어려운 디스크 액세스 패턴을 생성한다는 것을 의미하므로 모든 작업 속도가 느려지고 파일 조각화가 더 많이 발생합니다.

+0

알겠습니다. 선생님! 정보 주셔서 감사합니다! –