并行化(Java8)与并发性(Java7)

并行化(Java8)与并发性(Java7),java,multithreading,Java,Multithreading,我想解析多个文件以提取所需的数据,然后将输出写入XML文件。我使用了可调用接口来实现这一点。我的同事让我使用Java8特性,它可以轻松完成这项工作。我真的不知道我现在应该用哪一个 list.parallelStream().forEach(a -> { System.out.println(a); }); 只有当您有独立的任务要处理时,使用并发或并行流才有帮助。当你不这样做的时候,一个很好的例子是你在共享资源上锁定了什么 // makes no s

我想解析多个文件以提取所需的数据,然后将输出写入
XML
文件。我使用了
可调用接口
来实现这一点。我的同事让我使用
Java8
特性,它可以轻松完成这项工作。我真的不知道我现在应该用哪一个

list.parallelStream().forEach(a -> {
            System.out.println(a);
        });

只有当您有独立的任务要处理时,使用并发或并行流才有帮助。当你不这样做的时候,一个很好的例子是你在共享资源上锁定了什么

// makes no sense to use parallel here.
list.parallelStream().forEach(a -> {
        // locks System.out so only one thread at a time can do any work.
        System.out.println(a);
    });
然而,作为一个一般性问题,我将使用parallelStream来处理数据,而不是直接使用并发库,因为

  • 功能性的编码风格不鼓励共享可变状态。(实际上,在函数式编程中,我们不应该有可变状态,但Java并不是真正的函数式语言)
  • 它更易于编写和理解以处理数据
  • 更容易测试使用并行是否有帮助。最有可能的情况是,ti不会这样做,您可以轻松地将其更改回串行
我认为使用并行编码真正有帮助的可能性很低,并行流的最佳特性不是添加有多简单,而是删除有多简单


如果您有难以作为数据流建模的临时工作,那么并发库会更好。e、 g.使用ExecutorService实现客户端请求的工作池可能更简单。

你能为你的
可调用的
发布代码吗?
?我认为,在不知道其利弊的情况下使用并行流是没有意义的。所以你宁愿这样问,也不愿问你的同事:-)Java中的并行流在内部使用
ForkJoinPool
,这可能不是最适合的。因此,在您的情况下,它可能会或不会表现得更好。为什么不对结果进行基准测试呢?顺便说一句,如果数据集很小,那么并行流可能会比较慢(与可调用流相比),这是因为在多个线程之间拆分工作以及加入或合并结果时会产生开销。谢谢您的回答。我将使用parallelStream。@user3136136尝试一下,如果没有帮助,请切换回stream。