是否不鼓励在JavaEE容器中使用Java8并行流?

是否不鼓励在JavaEE容器中使用Java8并行流?,java,jakarta-ee,ejb,java-8,java-stream,Java,Jakarta Ee,Ejb,Java 8,Java Stream,鉴于此。是否也不鼓励在Java EE中使用可能产生线程的?请参见和中的备选答案。下面的计划可能是这样的,但在实践中似乎并非如此 我从评论中提到的文章中读到它的方式:它并不反对生成线程的方式,但在JavaEE上下文中对您没有多大帮助 从链接的讨论中: JavaEE并发人员已经讨论过了 目前的结果是FJP将优雅地降级为 从内部运行时的单线程(甚至调用方上下文)执行 EE容器 因此,您可以在同时在两种上下文中运行的过程或库中安全地使用并行流。当它在SE环境中运行时,它将使用神奇的并行诡计——但当它在

鉴于此。是否也不鼓励在Java EE中使用可能产生线程的?请参见
中的备选答案。下面的计划可能是这样的,但在实践中似乎并非如此


我从评论中提到的文章中读到它的方式:它并不反对生成线程的方式,但在JavaEE上下文中对您没有多大帮助

从链接的讨论中:

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

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


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

a请注意,单线程的优雅降级是不可用的。我还以为这是因为肖恩的回答和邮件列表的讨论,但我发现这并不是因为我在为他做研究。该机制不在JavaEE7规范中,也不在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源代码,没有一次使用
ForkJoinPool
ForkJoinWorkerThreadFactory
ForkJoinWorkerThread


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

@RobertHarvey在JavaEE中使用线程是双向的-Java 8引入了并行流(在后台使用线程)。我们可以在JavaEE中使用并行流吗?还是不鼓励使用并行流?我认为这是一个公平而有趣的问题。“我已经改变了一点措辞——可能还可以进一步改进。”罗伯塔维?线程是不受鼓励的(甚至被某些规范禁止),因为线程是由应用服务器本身管理的(请参阅右侧的第一个链接)——使用并行流可能会“破坏东西”——也可能不会。这就是问题所在。它可能会也可能不会根据规格“破坏东西”:这不是一个意见。就我的两个cts。你的电话-我今天休息!;-)(做出决定后,请随意删除噪音)是的,它会破坏东西。例如,安全性和事务性上下文由ThreadLocal变量处理。JPA实体不是线程安全的。因此,无论以何种方式生成线程,都会破坏安全性和事务处理。JavaEE7规范引入了一些特殊的执行器,如果您想在JavaEE环境中的线程中执行任务,应该使用这些执行器。但是JavaEE落后于JavaSE,并且还没有为并行流做好准备。这是一个好问题,JavaEE工程师已经回答了这个问题。对于所有并行操作,它们都恢复为顺序处理。你可以找到关于lambda的讨论-dev@openjdk.java.net邮件列表。@Shorn:并行流处理到单线程的优雅降级还不是JavaEE并发的一部分。因此,在JavaEE8中使用并行流仍然是不安全的。雅加达EE Concurrency计划在未来解决这一问题:通过将
java.util.concurrent.ForkJoinPool.common.parallelism
系统属性设置为
1
,能否以可移植的方式优雅地实现降级?