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

2022-09-01 05:26:59

鉴于不鼓励在 Java EE 容器中生成线程。在 Java EE 中使用可能生成线程的 Java 8 并行流是否也会被阻止?


答案 1

抬头,优雅降级到单线程不可用。我也认为这是因为Shorn的回答和邮件列表的讨论,但我发现这不是在研究这个问题时。该机制不在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功能,但我不知道它是否是规范的一部分。


答案 2

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


我从评论中提到的lambda-dev邮件列表讨论中阅读它的方式:它并不像生成线程那样被阻止 - 但在Java EE上下文中不会为你做任何事情。

从链接的讨论:

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

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

注意:上面引用的短语是将来时态 - 是否有人引用了一些明确的文档?


推荐