我有5份文件(比方说),每一份都有一些处理。这里的处理包括打开文档/文件、读取数据、进行一些文档操作(编辑文本等)。对于文档操作,我可能会使用docx4j或apache。但是我的用例是这样的--我想以某种方式并行地处理这些4-5文档,使用我在CPU上可用的多个核心。每个文档的处理是相互独立的。
在Java中实现这种并行处理的最佳方法是什么。我以前在java中使用过ExecutorService
,Thread
类也使用过。但我对Streams
或RxJava
等较新的概念不太了解。这个任务能否通过Java 8中引入的Java中的并行流来实现?有什么更好的使用执行器/流/线程类等。如果可以使用流,请提供一个链接,我可以找到一些教程如何做到这一点。谢谢你的帮忙!
发布于 2016-03-02 09:35:27
您可以使用以下模式使用Java流并行处理。
List<File> files = ...
files.parallelStream().forEach(f -> process(f));
或
File[] files = dir.listFiles();
Stream.of(files).parallel().forEach(f -> process(f));
注意:在本例中,process
不能抛出CheckedException。我建议您要么记录它,要么返回一个结果对象。
发布于 2016-03-02 10:07:28
如果您想了解ReactiveX,我建议您使用rxJava Observable.zip http://reactivex.io/documentation/operators/zip.html
在这里,您可以在并行上运行多个进程,例如:
public class ObservableZip {
private Scheduler scheduler;
private Scheduler scheduler1;
private Scheduler scheduler2;
@Test
public void testAsyncZip() {
scheduler = Schedulers.newThread();//Thread to open and read 1 file
scheduler1 = Schedulers.newThread();//Thread to open and read 1 file
scheduler2 = Schedulers.newThread();//Thread to open and read 1 file
Observable.zip(obAsyncString(file1), obAsyncString1(file2), obAsyncString2(file3), (s, s2, s3) -> s.concat(s2)
.concat(s3))
.subscribe(result -> showResult("All files in one:", result));
}
public void showResult(String transactionType, String result) {
System.out.println(result + " " +
transactionType);
}
public Observable<String> obAsyncString(File file) {
return Observable.just(file)
.observeOn(scheduler)
.doOnNext(val -> {
//Here you read your file
});
}
public Observable<String> obAsyncString1(File file) {
return Observable.just(file)
.observeOn(scheduler1)
.doOnNext(val -> {
//Here you read your file 2
});
}
public Observable<String> obAsyncString2(File file) {
return Observable.just(file)
.observeOn(scheduler2)
.doOnNext(val -> {
//Here you read your file 3
});
}
}
就像我说的,万一您想了解ReactiveX,因为如果不是,那么在堆栈中添加这个框架来解决这个问题会有点过分,我更愿意使用以前的流并行解决方案。
https://stackoverflow.com/questions/35743144
复制相似问题