【问题标题】:Parallelism issues when calling java from groovy从 groovy 调用 java 时的并行问题
【发布时间】:2016-08-29 17:16:25
【问题描述】:

我有一个使用大量并行执行(线程池、Java 8 流等)的大型 Java 框架。当我在纯 Java 中使用它并在计算繁重的任务中最大程度地加载所有 8 个内核时,它可以正常工作。

现在我为我的 java 类制作了一个精简的 Groovy 包装器来简化配置。我期望在 Groovy 调用上会有一点性能开销,但编译后的 Java 类的性能应该是一样的。在实践中,我看到性能大幅下降,程序仅使用一两个内核到 40-50%。当我将 Groovy 代码包装在 GroovyShell 中并从 Java 主类中调用它时,一切正常,我的性能恢复了 100%。

有什么问题? Groovy 启动器是否会覆盖某些默认线程池配置?

我正在使用 Java 8、Groovy 2.4.7 并从 Idea 调用 Groovy 脚本。

【问题讨论】:

    标签: java multithreading groovy


    【解决方案1】:

    我发现了问题。它不是java线程池,而是Groovyshell。我的java代码中有一个GroovyShell调用,所以当我从java调用它时它工作正常,但是当我从groovy调用它时,它由于某种原因导致当前线程等待GroovyShell调用在另一个线程上完成(即使我有不同的外壳对象)。

    我已经包含了同步解析脚本缓存(脚本被解析一次,然后与不同的绑定一起使用),它解决了这个问题(也大大提高了这部分代码的性能)。

    唯一的问题是,由于没有明显的方法可以克隆脚本并将其分发给不同的线程,因此我需要同步调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多