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

2023-11-30

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


您不想并行读取文件(磁盘 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;
}

TODO:添加异常处理等。您可能还想实例化ExecutorService在外面processFiles这样您就可以在通话之间重复使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐