【问题标题】:Java Parallel ProgrammingJava 并行编程
【发布时间】:2011-01-17 12:50:49
【问题描述】:

我需要在我的多核桌面上并行化 CPU 密集型 Java 应用程序,但我对线程编程不太满意。我研究了 Scala,但这意味着学习一门非常耗时的新语言。我还查看了 Ateji PX Java 并行扩展,它们看起来很容易使用,但还没有机会对其进行评估。有人会推荐它吗?欢迎提出其他建议。

提前感谢您的帮助

比尔

【问题讨论】:

标签: java multithreading parallel-processing parallel-extensions multicore


【解决方案1】:

我建议您尝试使用内置的 ExecutorService 来跨多个线程/内核分配多个任务。您有什么要求这可能不适合您吗?

【讨论】:

  • 在 2004 年将它们添加到 Java 之前,它们已经存在多年,因此您可以对它们的工作充满信心。此外,它们在 JVM 中具有内置支持,而外部库无法安全地做到这一点。
  • +1,但需要注意的是,进入并发编程并不像将代码分割成任务并插入执行程序那样简单。在任何实质性应用程序中,通常都存在许多线程安全和排序问题。
  • @Tim 这正是 Ateji PX 没有做的事情。
  • @Tim,这取决于代码的编写方式。一些编码风格(如函数式编程)比其他编码风格更容易并行化。一旦您了解了需要做什么,完全重写核心代码是最好的方法并非不可能。 ;)
【解决方案2】:

Java 并发工具:

http://download.oracle.com/javase/1.5.0/docs/guide/concurrency/overview.html

使 Java 上的并行编程比以前更容易。我建议从那里开始 - 如果您对使用线程的那种级别感到不舒服,我会三思而后行。并行化任何东西都需要对如何完成和协调并发计算有一定程度的技术舒适度。在我看来,它不能比那个框架容易得多 - 这就是你看到这么少替代品的部分原因。

其次,您应该考虑的主要问题是并行化的工作单元是什么。如果您的工作单元是独立的(即每个并行任务不会影响其他任务),这通常会容易得多,因为您根本不需要担心太多(或任何)同步。努力思考如何对问题进行建模,以使计算尽可能独立。如果你建模得好,你几乎肯定会减少代码行数(从而减少错误等)。

诚然,为您自动并行化的框架不太容易出错,但如果您的模型工作单元不符合它们的并行化方案,则可能不是最佳的。

【讨论】:

    【解决方案3】:

    我是Ateji PX 的首席开发人员。正如您所提到的,保证线程安全是一个重要的话题。这也是一个非常困难的问题,除了手写和手工检查的@ThreadSafe 注释之外没有太多帮助。参见例如“线程问题”。

    我们目前正在为 Ateji PX 开发并行验证器。这已经成为可能,因为 Ateji PX 中的并行性是组合的(与线程不同)并且基于良好的数学基础,即 pi 演算。即使没有工具,经验表明,以直观和组合的方式表达并行性可以更容易地“思考并行”并更早发现错误。

    【讨论】:

      【解决方案4】:

      我快速浏览了 Ateji PX 网站。似乎是一个不错的产品,但我担心您会在某个时候感到失望,因为 Ateji PX 只为您提供了一种直观简单的方法来执行高级并行操作,例如将工作负载分配给几个工人,在并行任务之间创建集合点等。但是,正如您可以在 如何检测和防止数据依赖关系?部分中的 FAQ 中阅读的那样,Ateji PX 不确保底层代码是线程安全的。所以无论如何,你仍然需要 Java 线程编程方面的技能。

      编辑:

      还要考虑到,当维护时间到来而您无法执行维护时,与 Ateji PX 相比,找到具有标准 Java 多线程编程技能的承包商、员工或实习生会更容易。

      最后,有 30 天免费评估,试试吧。

      【讨论】:

        【解决方案5】:

        Doug lea 为 Java 7 提出了用于分布式处理的 Fork Join。

        【讨论】:

        • 这是 .NET 实现的好处之一......他们已经启动并运行了 fork/join 实现,它确实简化了事情......当然,这取决于您的需求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        相关资源
        最近更新 更多