鉴于spawning threads in Java EE containers are discouraged。将使用Java 8 parallel streams,这可能产生线程,里面的Java EE太灰心?
编辑请参阅从andrepnh
备选答案。下面可能已经是计划,但它不会出现在实践中都发挥出了这种方式。
该办法从我在评论中提到的lambda-dev mailing list discussion阅读:它不气馁的方式产卵线程是 - 但什么都不会做太多你在Java EE环境。
从链接的讨论:
在Java EE并发乡亲经过这一被已经讲过,目前的结果是,由EE容器中运行时会FJP优雅降级单线程(甚至调用者上下文)执行
所以,你可以在两个环境中运行的程序或库安全地使用并行流。当它在SE环境中的运行,这将与神奇平行的恶作剧 - 但是当它在Java EE环境中的运行,将优雅降级到串行执行。
注:以上报价短语是将来时 - 没有任何人有一些明确的文档引文?
抬起头,优雅降级到单个线程不可用。我还以为是因为剪毛的答案和邮件列表讨论的,但我发现它不是,而研究的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功能,但我不知道这是否是规范的一部分。