Java ExecutorService比复制文件的顺序文件进程慢

Java ExecutorService比复制文件的顺序文件进程慢,java,synchronized,executorservice,Java,Synchronized,Executorservice,这是我使用ExecutorService将文件从一个目录复制到另一个目录的代码,但它比顺序操作慢。我正在使用未同步的apache FileUtils copyFile方法。有什么问题吗 public class ExecutorService { private static java.util.concurrent.ExecutorService pool; public ExecutorService() { pool = Executors.newFixedThreadPo

这是我使用ExecutorService将文件从一个目录复制到另一个目录的代码,但它比顺序操作慢。我正在使用未同步的apache FileUtils copyFile方法。有什么问题吗

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 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);

  }

 }
我真的不明白为什么你会认为线程池可以加速文件传输。尝试以下操作:运行单线程版本并监视CPU使用情况。我的预期是:低于10%

文件复制不是CPU密集型操作,而且,并行化只意味着创建了一种困难的磁盘访问模式,这会减慢整个过程,并可能导致更多的文件碎片

有什么问题吗

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);

  }

 }
我真的不明白为什么你会认为线程池可以加速文件传输。尝试以下操作:运行单线程版本并监视CPU使用情况。我的预期是:低于10%

文件复制不是CPU密集型操作,而且,并行化只意味着创建了一种困难的磁盘访问模式,这会减慢整个过程,并可能导致更多的文件碎片