为什么Scala构建自己的ForkJoinPool而不是使用java.util.concurrent.ForkJoinPool#commonPool?

时间:2019-05-15 09:14:55

标签: java scala threadpool

Java和Scala都引入了自己的全局ForkJoinPool,Java为dbCollection.users.find({ _id: {$in: usersIds} }) ,Scala为java.util.concurrent.ForkJoinPool#commonPool。 这两个似乎都打算用于相同的用例,特别是运行非阻塞并发任务(通常是隐式地)。 现在,根据我的理解,如果您以错误的方式选择了互操作性依赖项,您将最终得到两个线程池做完全相同的事情,一个用于Java世界,另一个用于Scala世界。

因此,除非我缺少明显的东西,否则Scala是否有充分的理由不将Java commonPool用作其全局ExecutionContext?

2 个答案:

答案 0 :(得分:2)

要添加到其他答案-除了JVM版本问题之外,使用JVM特定的实现会将Scala API绑定到Java内部。即使最初不是目标,现在Scala社区也希望针对多个后端:我们有Scala,Scala.js和Scala Native。如果我们决定更改内容并将Scala库与JVM API耦合,则没有充分的理由-毕竟JVM上的所有ExecutionContext仍在内部使用某些Java的线程池实现,因此,这就像我们在重新发明轮子一样。

答案 1 :(得分:0)

ForkJoinPoolJava 7中引入的,因此1.7下的任何JVM都无法调用它。为了执行在<1.7 VM上运行的Scala程序,当时是必须的;如今,当我们达到1.8下针对JVM的EOL时,我想不需要维护那块蛋糕了,因为运行的每个JVM Scala都应包括Java类/包。

还要注意池中引入的其他changes,如this answer所述。