Java 8中的并行性

时间:2012-09-02 07:41:41

标签: java parallel-processing java-8

我尝试使用新的并行功能JDK8,但不幸的是,我无法让它工作。 NetBeans 7.1说“并行”方法不存在。

此方法是否需要特殊导入? 有没有人有示例代码演示Java 8并行性?

5 个答案:

答案 0 :(得分:8)

我已经玩JDK8 Lambda Developer Preview几个星期了。以下是我为简化代码编译和测试所做的工作:

配置JEdit以编译JDK 8代码

以下指南介绍了如何配置Apache Ant和JEdit以使用JDK 8 Lambda Expressions轻松编译源代码以及JDK 8 Lambda Developer Preview中的新API功能。

这就是我今天所做的,主要是因为还没有IDE支持这些JDK 8功能。

下载以下内容:

然后创建以下目录结构:

Sanbox
|-----jdk8
|-----ant
|-----projects
  • 将未压缩的JDK内部版本放在jdk8目录中。
  • 将未压缩的Apache Ant放在ant目录中。
  • 项目目录将用于JEdit项目。

然后安装以下JEdit插件:

  • Ant Farm
  • Java Fold
  • 项目构建器
  • 项目查看器
  • 项目向导
  • SVN插件(我使用它来将我的项目与我的仓库同步,​​但您可能不需要它)

现在,配置您的Apache Ant:

  • 在名为antrc_pre.bat的主文件夹中创建一个文件(即%USERPROFILE%\ antrc_pre.bat)。
  • (注意:如果您使用的是Linux,可以在〜/ .ant / ant.conf中配置它。)
  • 此文件将在运行任何任务之前由Apache Ant运行,因此,这是一个通过定义JAVA_HOME变量来配置或覆盖您要使用的JDK的地方。
  • 在此文件的顶部定义JAVA_HOME变量,并使其指向安装JDK8的目录。有点像这样:SET JAVA_HOME=C:\Sanbox\jdk8
  • 确保在完成JDK 8会话后将其注释掉,以便Ant继续使用默认配置。

配置JEdit Ant插件的时间

  • 在JEdit中转到插件 - >插件选项 - >蚂蚁农场 - >构建选项
  • 在对话框中选择选项:“使用外部脚本/构建文件运行Ant目标”
  • 选择ant.bat脚本(即C:\ Sandbox \ ant \ bin \ ant.bat)。
  • 注意:如果您使用的是Ant 1.8.x,则很可能需要在插件的属性部分添加一个属性:build.compiler = javac1.7,否则在编译时会出错JDK 8.虽然我没有使用Ant 1.7这个问题。

然后创建一个新的Java项目:

  • 在JEdit中转到插件 - >项目构建器 - >创建新项目
  • 选择Java Application并单击Next
  • 选择项目目录作为查找文件的位置(即C:\ Sanbox \ projects)。

瞧!此时,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()方法。