我尝试使用新的并行功能 JDK8,但不幸的是,我无法让它工作。NetBeans 7.1 说不存在“并行”方法。
这种方法需要特殊导入吗?有人有演示 Java 8 并行性的示例代码吗?
我尝试使用新的并行功能 JDK8,但不幸的是,我无法让它工作。NetBeans 7.1 说不存在“并行”方法。
这种方法需要特殊导入吗?有人有演示 Java 8 并行性的示例代码吗?
几周以来,我一直在使用 JDK8 Lambda Developer Preview。以下是我为简化代码的编译和测试所做的工作:
以下指南介绍了如何配置 Apache Ant 和 JEdit,以便使用 JDK 8 Lambda 表达式和 JDK 8 Lambda 开发人员预览版中的新 API 功能轻松编译源代码。
这就是我今天所做的,主要是因为还没有 IDE 支持这些 JDK 8 特性。
下载以下内容:
然后创建以下目录结构:
Sanbox
|-----jdk8
|-----ant
|-----projects
然后安装以下 JEdit 插件:
现在,配置您的 Apache Ant:
SET JAVA_HOME=C:\Sanbox\jdk8
是时候配置 JEdit Ant 插件了
然后创建一个新的 Java 项目:
瞧!此时,JEdit 会在工具栏中呈现四个按钮:Build Application、Compile、Clean 和 Run Application。这些都是基于 build.xml 文件并根据相应的 Ant 任务执行的。一切顺利,您可以开始编写 lambda 表达式并使用新的 API:-)
在上一个开发者预览版 (b50) 中,几乎没有实现并行。我可以看到他们在一个单独的分支中做更多的工作(如果你想下载并构建 OpenJDK8 源代码)。
但是,您可以使用在数组Arrays.parallell
上创建包装器的方法。ParallelIterable
这可以用来测试一些并行特性。
我做了一个例子来在一个大数组中找到素数。当我并行运行它时,我可以验证我所有的四个内核都被使用了。
Integer[] source = new Integer[30000000];
for(int i=0; i<source.length; i++)
source[i] = i;
ParallelIterable<Integer> allIntegers = Arrays.parallel(source).filter(isPrime);
Iterable<Integer> primes = allIntegers.into(new LinkedList<Integer>());
这在我的带有 Apache Ant 8.4.x 和 JDk8-b50 的 JEdit 项目中编译并运行良好。
我希望这有帮助。
PD:
isPrime
为了不影响示例的简单性,我没有在上面的代码中定义谓词。我很确定每个人都可以轻松地定义一个素数谓词来尝试这段代码。
您可以使用 Netbeans 的夜间版本,它现在对 JDK8 功能有一些实验性支持 - 我已经尝试过,它似乎与 lambdas 配合得很好(至少你不会在它们下面看到红色曲线,自动格式化并且建议的更正似乎还没有正常工作,但它们更多的是小问题。)您需要确保将启用 Lambda 的 JDK8 添加为 Java 平台,然后将源级别设置为Java 8 用于您想要试验的项目。
您可以在此处获取最新的支持 Lambda 的 JDK 构建。
在撰写本文时,静态类上有 3 种类型的并行方法Arrays
可以试验 - parallelStream()
、parallelPrefix()
和parallelSort()
。但是请注意,这可能会在最终发布之前发生变化,目前的 API 非常不稳定。
检查您的 netbeans 是否使用 jdk8(我对此表示怀疑)。如果没有,则使其指向 jdk8 的本地副本,而不是内置 jdk。希望这可以帮助。
我的建议是将 Netbeans 放在一边,使用纯文本编辑器编辑您的 Java 代码,然后使用 Java 8 工具链从命令提示符编译和运行它。这样您就可以确定您的问题不是由 Netbeans 问题引起的。
下面的示例查找我的文档目录中的所有目录:
List<File> directories = Arrays.asList(new File("/Users/sid/Documents")
.listFiles())
.parallelStream()
.filter(t -> t.isDirectory() == true)
.collect(Collectors.toList());
Java 8 提供流支持,将集合转换为连续的对象流。如果集合的大小很小,.stream()就可以了。但是如果你有一个大集合并且想要利用并行特性,那么你可以使用.parallelStream()方法。