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

鉴于不鼓励在Java EE容器中生成线程 。 在Java EE中使用Java 8并行流可能会产生线程吗?

我从评论中提到的lambda-dev邮件列表讨论中读取它的方式:它并不劝阻产生线程的方式 – 但在Java EE上下文中不会对你做任何事情。

从链接的讨论:

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

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

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

抬头,单线程的优雅降级不可用。 我也认为这是因为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,因为许多框架将利用jdk8function,但我不知道它是否是规范的一部分。