Luí*_*hin 30 java ejb java-ee java-8 java-stream
鉴于不鼓励在Java EE容器中生成线程.是否也不鼓励在Java EE中使用可能产生线程的Java 8并行流?
Sho*_*orn 12
编辑 请参阅替代答案andrepnh.以下可能是计划,但在实践中似乎没有这样做.
我从评论中提到的lambda-dev邮件列表讨论中读取它的方式:它并不劝阻产生线程的方式 - 但在Java EE上下文中不会对你做任何事情.
来自链接的讨论:
Java EE并发人员已经讨论过这个问题,目前的结果是当从EE容器内部运行时,FJP将优雅地降级为单线程(甚至是调用者上下文)执行
因此,您可以在两个上下文中运行的过程或库中安全地使用并行流.当它在SE环境中运行时,它将使用神奇的并行恶作剧 - 但是当它在EE环境中运行时,它将优雅地降级为串行执行.
注意:上面引用的短语是将来时态 - 是否有人对某些权威文档有引用?
and*_*pnh 11
抬头,单线程的优雅降级不可用.我也认为这是因为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);
}
}
Run Code Online (Sandbox Code Playgroud)
你会得到类似的东西:
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
...
Run Code Online (Sandbox Code Playgroud)
我还检查了glassfish 4.1.1源代码,并没有单独使用ForkJoinPool,ForkJoinWorkerThreadFactory或ForkJoinWorkerThread.
该机制可以添加到EE 8,因为许多框架将利用jdk8功能,但我不知道它是否是规范的一部分.
| 归档时间: |
|
| 查看次数: |
5406 次 |
| 最近记录: |