鉴于spawning threads in Java EE containers are discouraged。是否也不鼓励在Java EE中使用可能产生线程的Java 8 parallel streams?
答案 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源代码,并且没有使用ForkJoinPool
,ForkJoinWorkerThreadFactory
或ForkJoinWorkerThread
。
该机制可以添加到EE 8,因为许多框架将利用jdk8功能,但我不知道它是否是规范的一部分。