3

我知道在 JavaEE 应用程序中分离线程是一个很大的禁忌。但是,我有一个应用程序非常适合Java 的 fork/join 机制。但是,由于不应该在应用程序中创建线程,有没有办法在我的 EJB 中使用它?我知道在 WebSphere 应用程序上,异步 bean 功能提供了这一点。但是,我的应用程序部署在 JBoss EAP 6.1 上,所以这不是一个选项。

在 JavaEE 应用程序中是否有“合法”的方式来完成 fork/join?

4

4 回答 4

8

现在最好的答案是 Java EE 7 规范中的 Concurrency Utils API。你有 ManagedExecutors 和 ManagedThreadPools。由于这些托管线程功能和托管任务由应用程序服务器控制,因此确保您的分叉连接计算使用这些资源,然后您可以确保线程被包含而不是孤立。

最后,您可能必须编写一个“托管”的 ForkJoinPool 版本才能获得最佳解决方案。但是这应该是可能的,因为第一步会用托管版本替换线程池执行器。

PS:Java EE 8 必须在 Java SE 8 发布时解决这个问题!

于 2014-01-02T10:16:36.820 回答
4

JBoss EAP 6.1 实际上也支持异步 EJB。但是 AFAIK 异步 EJB 仅在您不需要等待子任务的结果时才真正帮助您(例如,您只需要 fork 部分,而不是 join 部分)。

如果您java.util.concurrent.ForkJoinPool在 Java EE 中使用没有合法的使用方式,Java EE 7 / JSR-236 也无济于事(我向 EG 提出了这一点,但他们不会被打扰)。ForkJoinPool来自 EE 7 / JSR-236 的非法 spwans 线程ManagedThreadFactory不是ForkJoinWorkerThreadFactory.

在 JDK 8 中有一个默认值ForkJoinPool,可以配置为不生成任何线程并在调用者线程中运行所有内容(可能通过"java.util.concurrent.ForkJoinPool.common.parallelism"系统属性)。这使它合法,但不会给你任何并行性。

更一般地说,fork join 任务应该是计算绑定的,而不是 IO 绑定的。理论上,只要您不使用任何 Java EE 功能(并在您的应用程序取消部署时让它们终止),在 Java EE 中生成线程线程是安全的。例如:

  • 交易
  • JDBC
  • JPA(包括延迟加载)
  • 安全
  • EJB
  • 远程处理
  • 类加载
  • JNDI
  • …</li>

这些特性通常也会使任务受 IO 限制而不是 CPU 限制。

是的,同样的问题也适用于 JDK 8 并行流。

于 2013-12-31T15:58:00.777 回答
1

您可以创建一个类似于“服务”(即 JMX 服务)的 Singleton ejb。在此特殊服务的上下文中,您可以控制线程和同步。因此,您可以创建一个使用 fork/join 逻辑封装作业执行的单例 ejb,并且您的标准 ejbs/mdbs 可以使用此服务。

于 2013-12-31T15:16:32.907 回答
-2

在 JavaEE 中,容器控制线程。想象一下,如果每个程序员都决定创建自己的线程会发生什么?无论如何,在 Java8 的并行批量操作中使用线程已被拒绝。看这里你可以做出任何你想要的假设,是的,我写了这篇文章。

于 2013-12-31T14:52:40.553 回答