【问题标题】:Better framework/abstraction for java concurrency更好的 java 并发框架/抽象
【发布时间】:2014-09-15 18:32:14
【问题描述】:

Java 5 及更高版本中的并发绝对是比处理原始线程更好的抽象。

我对 fork-and-join 和并行数组等内存数据结构的讨论印象深刻。不幸的是,Java 7 留下了 fork-and-join 的骨架和遗漏的数据结构。

想知道是否有类似且经过良好测试的框架/抽象可以有效地对庞大的数据集进行聚合。

【问题讨论】:

  • 问题是你是否想留在 Java 领域。 Scala 提供了全面的 Future 实现和不可变结构,可提供更好的并发属性。还要看看 Spark,它是一个用于内存(大)数据分析的框架(基于 Scala)。
  • Ummm RxJava 和 Java 8 让这个论点陷入了僵局——但 Scala 轻松赢得了许多其他论点,#1 少了很多“仪式”代码。
  • 是的,scala/clojures/coreAsync 是功能人员建议的其他框架。但是,一个具有并发和并行作业执行器的通用平台将是最合适的。

标签: java multithreading data-analysis fork-join


【解决方案1】:

我真的认为你应该看看 RxJava:https://github.com/Netflix/RxJava/wiki

“它扩展了观察者模式以支持数据/事件序列,并添加了允许您以声明方式将序列组合在一起的运算符,同时抽象出对低级线程、同步、线程安全、并发数据等事物的担忧结构和非阻塞 I/O。"

...

“很难使用 Futures 来优化组合条件异步执行流程(或者是不可能的,因为每个请求的延迟在运行时会有所不同)。当然可以这样做,但它很快就会变得复杂(因此容易出错) ) 或过早阻塞 Future.get(),这消除了异步执行的好处

另一方面,RxJava Observables 用于组合异步数据的流和序列。"

【讨论】:

  • 感谢您的回答。对于我的用例,Rx 非常适合计算,但不适合阻塞 io 作业。我有两者的混合。像 stage1 从 DB 读取数据(粗粒度),Stage2 进程(细粒度),stage3 persist(粗粒度)。对于粗粒度线程池执行器最适合可调线程数,但对于具有固定线程数(〜核心数)的细粒度 forx-and-join 是好的。框架应该适合这两者。
【解决方案2】:

尽管@user1500191 提到了RxJava,但我可以添加Akka 作为您的另一个选项。

Akka 是一个工具包和运行时,用于在 JVM 上构建高度并发、分布式和容错的事件驱动应用程序。

【讨论】:

  • Akka 可能会解决,但我觉得我手头的用例太小,无法容纳 Akka。可能由 Rx 提供,但它最适合我下面解释的一半问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-30
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2011-04-26
  • 2015-05-05
相关资源
最近更新 更多