首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -并行处理文档

Java -并行处理文档
EN

Stack Overflow用户
提问于 2016-03-02 09:27:52
回答 2查看 1.3K关注 0票数 3

我有5份文件(比方说),每一份都有一些处理。这里的处理包括打开文档/文件、读取数据、进行一些文档操作(编辑文本等)。对于文档操作,我可能会使用docx4j或apache。但是我的用例是这样的--我想以某种方式并行地处理这些4-5文档,使用我在CPU上可用的多个核心。每个文档的处理是相互独立的。

在Java中实现这种并行处理的最佳方法是什么。我以前在java中使用过ExecutorServiceThread类也使用过。但我对StreamsRxJava等较新的概念不太了解。这个任务能否通过Java 8中引入的Java中的并行流来实现?有什么更好的使用执行器/流/线程类等。如果可以使用流,请提供一个链接,我可以找到一些教程如何做到这一点。谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 09:35:27

您可以使用以下模式使用Java流并行处理。

代码语言:javascript
运行
复制
List<File> files = ...
files.parallelStream().forEach(f -> process(f));

代码语言:javascript
运行
复制
File[] files = dir.listFiles();
Stream.of(files).parallel().forEach(f -> process(f));

注意:在本例中,process不能抛出CheckedException。我建议您要么记录它,要么返回一个结果对象。

票数 3
EN

Stack Overflow用户

发布于 2016-03-02 10:07:28

如果您想了解ReactiveX,我建议您使用rxJava Observable.zip http://reactivex.io/documentation/operators/zip.html

在这里,您可以在并行上运行多个进程,例如:

代码语言:javascript
运行
复制
 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,因为如果不是,那么在堆栈中添加这个框架来解决这个问题会有点过分,我更愿意使用以前的流并行解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35743144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档