如何使用多个线程处理存储在本地磁盘中的大量文件(使用文件锁)

3 java

如何在java中使用多个线程来处理存储在本地磁盘目录中的大量文件(使用文件锁)

gus*_*afc 5

您不希望以并行方式读取文件(磁盘I/O不能很好地并行化).最好让单个线程读取文件,将内容发送到工作线程进行并行处理,然后从工作者收集结果.使用优秀的ExecutorService&c:o免除java.util.concurrent了线程的肮脏细节,使您的解决方案更加灵活.

这是一个简单的例子.假设Foo是处理文件的结果:

public List<Foo> processFiles(Iterable<File> files){
    List<Future<Foo>> futures = new ArrayList<Future<Foo>>();
    ExecutorService exec = Executors.newFixedThreadPool(
        Runtime.getRuntime().availableProcessors());
    for (File f : files){
        final byte[] bytes = readAllBytes(f); // defined elsewhere
        futures.add(exec.submit(new Callable<Foo>(){
            public Foo call(){
                InputStream in = new ByteArrayInputStream(bytes);
                // Read a Foo object from "in" and return it
            }
        }));
    }
    List<Foo> foos = new List<Foo>(futures.size());
    for (Future<Foo> f : futures) foos.add(f.get());
    exec.shutdown();
    return foos;
}
Run Code Online (Sandbox Code Playgroud)

TODO:添加异常处理等.您可能还希望实例化ExecutorService外部,processFiles以便在调用之间重用它.