它是使用Java EE容器内的Java 8并行流灰心?

问题描述 投票:28回答:2

鉴于spawning threads in Java EE containers are discouraged。将使用Java 8 parallel streams,这可能产生线程,里面的Java EE太灰心?

java java-ee ejb java-8 java-stream
2个回答
12
投票

编辑请参阅从andrepnh备选答案。下面可能已经是计划,但它不会出现在实践中都发挥出了这种方式。


该办法从我在评论中提到的lambda-dev mailing list discussion阅读:它不气馁的方式产卵线程是 - 但什么都不会做太多你在Java EE环境。

从链接的讨论:

在Java EE并发乡亲经过这一被已经讲过,目前的结果是,由EE容器中运行时会FJP优雅降级单线程(甚至调用者上下文)执行

所以,你可以在两个环境中运行的程序或库安全地使用并行流。当它在SE环境中的运行,这将与神奇平行的恶作剧 - 但是当它在Java EE环境中的运行,将优雅降级到串行执行。

注:以上报价短语是将来时 - 没有任何人有一些明确的文档引文?


11
投票

抬起头,优雅降级到单个线程不可用。我还以为是因为剪毛的答案和邮件列表讨论的,但我发现它不是,而研究的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源代码,并没有一个单一的使用ForkJoinPoolForkJoinWorkerThreadFactoryForkJoinWorkerThread的。

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

© www.soinside.com 2019 - 2024. All rights reserved.