2014-03-13 16 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

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