11

鉴于新的 Java8,我们正在为异步任务获得非常好的特性,例如 CompletableFuture 和 .paralellStream()。如果您按照我的理解在 Java SE 中运行它,您将使用 ForkJoinPool,但是如果我在例如 Wildfly 或 TomcatEE 中运行以下示例会发生什么?

//Here I start a comp.Future without giving an Executor
test = CompletableFuture.supplyAsync(() -> timeConsumingMethod());
//Here I start a parallel stream 
mList.paralell().filter(...).collect(Collectors.toList())

会发生什么,如果我会从哪里借用我的资源

  1. 这些示例在 @Stateful bean 中运行
  2. 这些示例在 @Stateless bean 中运行
  3. 这些示例在 CDI bean 中运行
4

1 回答 1

10

您不应该在 Java EE 中使用 ForkJoinPool。只有应用服务器应该提供并行结构(如 Java EE 7 中的ManagedExecutorService),因为线程必须由容器管理

奇怪的是,这个答案中提到的邮件列表中有一条消息声称 ForkJoinPool 将优雅地降级为 EE 容器中的单线程。我已经用 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 21 on thread http-listener-1(4)
Info:   Task 11 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 22 on thread http-listener-1(4)
Info:   Task 8 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 23 on thread http-listener-1(4)
Info:   Task 9 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 18 on thread http-listener-1(4)
Info:   Task 14 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 19 on thread http-listener-1(4)
Info:   Task 15 on thread ForkJoinPool.commonPool-worker-3
Info:   Task 16 on thread http-listener-1(4)
Info:   Task 17 on thread http-listener-1(4)
Info:   Task 4 on thread http-listener-1(4)
Info:   Task 5 on thread http-listener-1(4)
Info:   Task 6 on thread http-listener-1(4)
Info:   Task 7 on thread http-listener-1(4)
Info:   Task 2 on thread http-listener-1(4)
Info:   Task 3 on thread http-listener-1(4)
Info:   Task 0 on thread http-listener-1(4)
Info:   Task 1 on thread http-listener-1(4)
Info:   Task 26 on thread http-listener-1(4)
Info:   Task 27 on thread http-listener-1(4)
Info:   Task 24 on thread http-listener-1(4)
Info:   Task 25 on thread http-listener-1(4)
Info:   Task 12 on thread http-listener-1(4)
Info:   Task 13 on thread http-listener-1(4)
Info:   Task 30 on thread http-listener-1(4)
Info:   Task 31 on thread http-listener-1(4)
Info:   Task 28 on thread ForkJoinPool.commonPool-worker-0
Info:   Task 29 on thread ForkJoinPool.commonPool-worker-0

当大多数单独的规范将利用 SE 8 特性时,Java EE 8 上可能会出现降级。


编辑

我检查了 glassfish 4.1.1 的源代码,并没有单独使用ForkJoinPool,ForkJoinWorkerThreadFactoryForkJoinWorkerThread. 因此,应用服务器管理的并行资源不基于任何这些结构。不幸的是,实际上没有可用的降级机制。

于 2016-04-01T02:16:46.867 回答