当前位置: 首页 > 知识库问答 >
问题:

是否不鼓励在JavaEE容器中使用Java8个并行流?

宇文和同
2023-03-14

鉴于不鼓励在JavaEE容器中生成线程。在JavaEE内部使用Java8并行流(可能会产生线程)是否也会被阻止?

共有2个答案

庞旺
2023-03-14

编辑请参见中的备选答案。下面的计划可能是这样的,但在实践中似乎并非如此。

我从评论中提到的lambda-dev邮件列表讨论中读到的方式是:它并不像生成线程那样令人沮丧——但是在JavaEE上下文中不会对你有什么帮助。

来自链接讨论:

JavaEE并发人员已经讨论过这一点,目前的结果是,当从EE容器中运行时,FJP将优雅地降级为单线程(甚至调用方上下文)执行

因此,您可以在同时在两种上下文中运行的过程或库中安全地使用并行流。当它在SE环境中运行时,它将使用神奇的并行诡计——但当它在EE环境中运行时,它将优雅地降级为串行执行。

注:上面引用的短语是将来时态-是否有人引用过某些权威文档?

孟晨朗
2023-03-14

一个平头,优雅的降级为单线程是不可用的。我还以为这是因为肖恩的回答和邮件列表的讨论,但我在研究这个问题时发现并不是这样。该机制不在JavaEE7规范中,也不在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

该机制可以添加到EE8中,因为许多框架将利用jdk8特性,但我不知道它是否是规范的一部分。

 类似资料:
  • 问题内容: 鉴于不建议使用Java EE容器中的生成线程。还会不鼓励在Java EE中使用Java 8并行流 (可能会产生线程)吗? 问题答案: 编辑 请参阅的替代答案。以下可能是计划,但在实践中似乎并没有采用这种方法。 我从评论中提到的lambda-dev邮件列表讨论中读取它的方式:不会阻止生成线程的方式-但在Java EE上下文中不会为您做任何事情。 从链接的讨论中: Java EE并发专家已

  • 问题内容: 关于Java EE开发的第一件事是,我不应该在Java EE容器中生成自己的线程。但是当我考虑它时,我不知道原因。 您能清楚地解释为什么不鼓励这样做吗? 我确信大多数企业应用程序都需要某种异步作业,例如邮件守护程序,空闲会话,清理作业等。 因此,如果确实不应该产生线程,那么在需要时正确的方法是什么? 问题答案: 不建议这样做,因为环境中的所有资源都应由服务器进行管理,并可能由服务器进行

  • 问题内容: 当通常足以处理方法中的大多数条件失败时,为什么不建议抛出泛型(java.lang.Exception)异常?我知道,如果一个方法可以抛出多种类型的异常,那么抛出异常的特定子类可能会澄清一些处理,但是在一般的失败/成功案例中,我认为Exception的作用已绰绰有余。 问题答案: 问题在于,它也是的超类,其中包含一些不应捕获的内容,因为它表明编程存在问题,而不是由上下文引起的特殊情况。通

  • 问题内容: 在我目前正在处理的项目中,我经常看到和在字段中一起使用。我从未在任何教程或其他资源中以这种方式看到过它。我用谷歌搜索了这个特定的组合,但是除了在GitHub上的这个线程外没有找到其他东西:https : //github.com/mockito/mockito/issues/169 这让我觉得我们在以一种奇怪的方式使用它。 注意:我认为有时同时使用两个批注是有道理的,因为如果仅使用 M

  • 问题内容: 这是来自Hibernate的官方教程: 还有一个替代声明,该声明允许使用组合键访问旧数据。强烈建议不要将其用于其他任何用途。 为什么不鼓励使用复合键?我正在考虑使用一个三列表,其中所有列都是外键,并且一起形成一个主键,这在我的模型中是有意义的关系。我不明白为什么这是一个坏主意,特别是我将在它们上使用索引。 有什么选择?创建一个额外的自动生成的列并将其用作主键?无论如何,我仍然需要查询我

  • 问题内容: C#目前发展势头良好。切换(或返回)Java 需要 具备哪些功能? 如果人们发布当前Java版本的变通方法,例如将Nullable包裹在自定义类中,以使其成为更有趣的Wiki,那也将非常有用。 问题答案: 作为.NET / C#开发人员,这里缺少让我烦恼的功能。此列表没有特别的顺序-正如想到的那样: Java库太小。对于普通的事情,我必须在5种竞争性开源产品之间进行选择,因为基本库在很