2014-03-13 21 views
0

這是我的代碼,它使用ExecutorService將文件從一個目錄複製到另一個目錄,但事實證明它比順序操作慢。我正在使用未同步的apache 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

好吧,先生!謝謝(你的)信息! –