是否不鼓励在Java EE容器中使用Java 8并行流?

时间:2014-04-03 18:13:43

标签: java java-ee ejb java-8 java-stream

鉴于spawning threads in Java EE containers are discouraged。是否也不鼓励在Java EE中使用可能产生线程的Java 8 parallel streams

2 个答案:

答案 0 :(得分:12)

编辑请参阅andrepnh的备用答案。以下可能是计划,但它似乎并没有在实践中发挥这种作用。


我从评论中提到的lambda-dev mailing list discussion中读取它的方式:它并没有阻止产生线程的方式 - 但是在Java EE上下文中不会为你做任何事情。

来自链接的讨论:

  已经讨论过Java EE并发人员了   这一点,目前的结果是FJP将优雅降级为   从内部运行时执行单线程(甚至调用者上下文)   EE容器

因此,您可以在两个上下文中运行的过程或库中安全地使用并行流。当它在SE环境中运行时,它将使用神奇的并行恶作剧 - 但是当它在EE环境中运行时,它将优雅地降级为串行执行。

注意:上面引用的短语是将来时 - 有没有人对某些权威文档有引用?

答案 1 :(得分:11)

抬头,单线程的优雅降级不可用。我也认为这是因为Shorn的答案和邮件列表讨论,但我发现它不是在研究this question时。该机制不在Java EE 7规范中,并且不在glassfish 4.1中。即使是另一个容器,它也不会是便携式的。

您可以通过调用以下方法对此进行测试:

@Singleton
public class SomeSingleton {
    public void fireStream() {
        IntStream.range(0, 32)
            .parallel()
            .mapToObj(i -> String.format("Task %d on thread %s", 
                i, Thread.currentThread().getName()))
            .forEach(System.out::println);
    }
}

你会得到类似的东西:

Info:   Task 20 on thread http-listener-1(4)
Info:   Task 10 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 28 on thread ForkJoinPool.commonPool-worker-0
...

我还检查了glassfish 4.1.1源代码,并且没有使用ForkJoinPoolForkJoinWorkerThreadFactoryForkJoinWorkerThread

该机制可以添加到EE 8,因为许多框架将利用jdk8功能,但我不知道它是否是规范的一部分。