【问题标题】:Parallelism in Java 8Java 8 中的并行性
【发布时间】:2012-08-27 09:14:59
【问题描述】:

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

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

【问题讨论】:

  • +1 因为我从这个问题中学到了一些新东西。 :)
  • Java 8 具有“并行特性”。 :)
  • :) Oracle 介绍了示例代码,但这还不够。 pastebin.com/QG3QVSMF
  • 嗯,这只是 lambda 的一个特性,可以并行化。
  • 以防万一其他人也犯了这个错字并从谷歌得到这个:Feature != Future

标签: java parallel-processing java-8


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我已经玩 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 Farm -> 构建选项
      • 在对话框中选择选项:“使用外部脚本/构建文件运行 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 项目中编译和运行良好。

      我希望这会有所帮助。

      警察局:

      为了不影响示例的简单性,我没有在上面的代码中定义谓词isPrime。我很确定每个人都可以轻松地定义一个素数谓词来尝试这段代码。

      【讨论】:

      • 如果sandbox/ant是ant的一个版本just用于JDK8测试中的项目,把JAVA_HOME定义放在sandbox/ant的顶部不是更好吗/bin/ant.bat 代替?这样你就不会影响你的其他工作。
      • 我不够聪明,无法为自己制定 isPrime:stackoverflow.com/questions/2385909/…
      【解决方案4】:

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

      您可以获取支持 Lambda 的最新版本的 JDK here

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

      【讨论】:

        【解决方案5】:

        以下示例查找我的文档目录中的所有目录:

        List<File> directories = Arrays.asList(new File("/Users/sid/Documents")
                                       .listFiles())
                                       .parallelStream()
                                       .filter(t -> t.isDirectory() == true)
                                       .collect(Collectors.toList());
        

        Java 8 提供流支持,将集合转换为连续的对象流。如果集合的大小很小 .stream() 就可以了。但是如果你有一个大集合并且想要利用并行特性,那么你可以使用 .parallelStream() 方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-24
          • 1970-01-01
          • 2016-08-27
          • 1970-01-01
          • 2017-04-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多