您不希望以并行方式读取文件(磁盘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
以便在调用之间重用它.
归档时间: |
|
查看次数: |
14132 次 |
最近记录: |