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(使用前将#替换为@)