我尝试使用新的并行功能JDK8,但不幸的是,我无法让它工作。 NetBeans 7.1说“并行”方法不存在。
此方法是否需要特殊导入? 有没有人有示例代码演示Java 8并行性?
答案 0 :(得分:8)
我已经玩JDK8 Lambda Developer Preview几个星期了。以下是我为简化代码编译和测试所做的工作:
以下指南介绍了如何配置Apache Ant和JEdit以使用JDK 8 Lambda Expressions轻松编译源代码以及JDK 8 Lambda Developer Preview中的新API功能。
这就是我今天所做的,主要是因为还没有IDE支持这些JDK 8功能。
下载以下内容:
然后创建以下目录结构:
Sanbox
|-----jdk8
|-----ant
|-----projects
然后安装以下JEdit插件:
现在,配置您的Apache Ant:
SET JAVA_HOME=C:\Sanbox\jdk8
配置JEdit Ant插件的时间
然后创建一个新的Java项目:
瞧!此时,JEdit将在工具栏中显示四个按钮:构建应用程序,编译,清理和运行应用程序。它们基于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
,以免模糊示例的简单性。我很确定eveyone可以轻松定义一个primality谓词来试用这段代码。
答案 1 :(得分:2)
我的建议是将Netbeans放在一边,使用纯文本编辑器编辑Java代码,然后使用Java 8工具链从命令提示符编译和运行它。这样你可以确定你的问题不是由于Netbeans问题造成的。
答案 2 :(得分:2)
检查你的netbeans是否使用jdk8(我对此表示怀疑)。如果它没有,那么它指向你的本地副本jdk8而不是内置的jdk。 希望这可以帮助。
答案 3 :(得分:2)
你可以使用现在有一些实验性支持JDK8功能的nightly version Netbeans - 我试过这个,它似乎与lambdas很好用(至少你没有得到红色的波浪形在它们之下,自动格式化和建议的更正似乎还没有正常工作,但它们更像是一些小问题。)您需要确保将支持Lambda的JDK8添加为Java平台,并且然后将源级别设置为要试验的项目的Java 8。
您可以获取JDK here的最新Lambda启用版本。
在撰写本文时,静态Arrays
类有三种类型的并行方法,可以使用 - parallelStream()
,parallelPrefix()
和parallelSort()
进行实验。但请注意,这可能会在最终版本发布之前发生变化,目前的API非常不稳定。
答案 4 :(得分:0)
下面的示例查找文档目录中的所有目录:
List<File> directories = Arrays.asList(new File("/Users/sid/Documents")
.listFiles())
.parallelStream()
.filter(t -> t.isDirectory() == true)
.collect(Collectors.toList());
Java 8提供了流支持,其中集合被转换为连续的对象流。如果集合的大小很小 .stream()就没问题。但是如果你有一个大集合并想要利用并行性功能,那么你可以使用 .parallelStream()方法。