15

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

这种方法需要特殊导入吗?有人有演示 Java 8 并行性的示例代码吗?

4

5 回答 5

8

几周以来,我一直在使用 JDK8 Lambda Developer Preview。以下是我为简化代码的编译和测试所做的工作:

配置 JEdit 以编译 JDK 8 代码

以下指南介绍了如何配置 Apache Ant 和 JEdit,以便使用 JDK 8 Lambda 表达式和 JDK 8 Lambda 开发人员预览版中的新 API 功能轻松编译源代码。

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

下载以下内容:

然后创建以下目录结构:

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

然后安装以下 JEdit 插件:

  • 蚂蚁农场
  • Java折叠
  • 项目生成器
  • 项目查看器
  • 项目向导
  • 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 应用程序并单击下一步
  • 选择您的项目目录作为定位文件的位置(即 C:\Sanbox\projects)。

瞧!此时,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为了不影响示例的简单性,我没有在上面的代码中定义谓词。我很确定每个人都可以轻松地定义一个素数谓词来尝试这段代码。

于 2012-09-02T23:16:23.973 回答
2

您可以使用 Netbeans 的夜间版本,它现在对 JDK8 功能有一些实验性支持 - 我已经尝试过,它似乎与 lambdas 配合得很好(至少你不会在它们下面看到红色曲线,自动格式化并且建议的更正似乎还没有正常工作,但它们更多的是小问题。)您需要确保将启用 Lambda 的 JDK8 添加为 Java 平台,然后将源级别设置为Java 8 用于您想要试验的项目。

您可以在此处获取最新的支持 Lambda 的 JDK 构建。

在撰写本文时,静态类上有 3 种类型的并行方法Arrays可以试验 - parallelStream()parallelPrefix()parallelSort()。但是请注意,这可能会在最终发布之前发生变化,目前的 API 非常不稳定。

于 2013-01-25T14:18:11.817 回答
2

检查您的 netbeans 是否使用 jdk8(我对此表示怀疑)。如果没有,则使其指向 jdk8 的本地副本,而不是内置 jdk。希望这可以帮助。

于 2012-09-02T08:32:47.973 回答
2

我的建议是将 Netbeans 放在一边,使用纯文本编辑器编辑您的 Java 代码,然后使用 Java 8 工具链从命令提示符编译和运行它。这样您就可以确定您的问题不是由 Netbeans 问题引起的。

于 2012-09-02T08:09:30.963 回答
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()方法。

于 2015-04-21T06:31:44.860 回答