Clojure 1.5的reducers可以与JDK的forkjoin版本(JDK 1.7+)或外部jsr166 jar一起工作。这给用户和构建带来了复杂性,需要处理这两种选项。
jsr166代码是公有领域,其他项目通常重新打包少量文件,并将其与项目一起分发(类似于我们处理asm的方式)。这使我们能够仅使用已知存在的jsr166版本,并且可以消除我们在Clojure 1.5中引入的自定义构建操作。
jsr166y与JDK 1.6+兼容,是当前Scala重新打包的版本。这是JDK 1.6和1.7的最佳选择。在JDK 1.8中,最佳选择将是java.util.concurrent中的内置版本(暂时跟踪jsr166e),然后随着更新将变为jsr166e。现在许多fork/join修复都被移植到了y和e。
以下为JDK 1.8的几种选择
- 为了最大兼容性,只使用重新打包的jsr166y,无论JDK如何(最简单)
- 检查JDK版本为1,并使用java.util.concurrent
- 检查JDK版本为1,并重新打包jsr166e并使用它
尚不清楚目前哪种方法最佳。