Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8集合并发处理_Java_Multithreading_Concurrency_Parallel Processing_Java 8 - Fatal编程技术网

Java 8集合并发处理

Java 8集合并发处理,java,multithreading,concurrency,parallel-processing,java-8,Java,Multithreading,Concurrency,Parallel Processing,Java 8,我计划在我的公司做一个关于Java8新特性和概念的内部演示 我想重点关注的是新集合库的并行处理能力 无论我在哪里读到关于Java8以及对集合库中更多函数式迭代器的需求,都会提到这将有助于利用当今常见的多核服务器。但很少有人提到这是如何实现的,以及这是否是一个普遍真理,更不用说任何性能基准了 即使是我公司中声称了解线程的有经验的开发人员也不知道底层线程是如何工作的,因此我正在尝试收集这方面的一些知识。我在阅读了几篇博客等文章后,做出了如下断言 对于以下几点的反馈,我将不胜感激。(对/错) 线程是操

我计划在我的公司做一个关于Java8新特性和概念的内部演示

我想重点关注的是新集合库的并行处理能力

无论我在哪里读到关于Java8以及对集合库中更多函数式迭代器的需求,都会提到这将有助于利用当今常见的多核服务器。但很少有人提到这是如何实现的,以及这是否是一个普遍真理,更不用说任何性能基准了

即使是我公司中声称了解线程的有经验的开发人员也不知道底层线程是如何工作的,因此我正在尝试收集这方面的一些知识。我在阅读了几篇博客等文章后,做出了如下断言

对于以下几点的反馈,我将不胜感激。(对/错)

  • 线程是操作系统中最低的调度单元(是的,是基本的东西,但不是所有的应用程序程序员都知道这一点;-)

  • 单线程程序一次只能在一个内核上运行。因此,在四核CPU中,75%的CPU没有被利用

  • 当前Java集合迭代器的问题在于它是一个外部迭代器,不可能(至少是现成的)将大量集合迭代分发到多个线程。新的集合库操作使并发成为可能,而无需处理低级并发问题

  • Java8使使用增强的集合库使用内部迭代器并行化迭代成为可能

    而不是Java7

    for(Shape s:shapes){if(s.getColor()==RED)s.setColor(BLUE);}

    我们在Java8中有

    shapes.forEach(s->{
    如果(s.getColor()==红色)
    s、 设置颜色(蓝色);})

  • 但是为了并行化上述迭代,必须显式地使用
    streamapi的
    method
    parallel()

    private static void打印使用CoolLambda(最终列表名称){
    names.parallelStream().forEach->System.out.println(s));
    System.out.println(“使用printUsingCoolLambda打印”);
    }

    但即使这样,也不能保证操作将并行完成,正如
    parallelStream()
    的Javadoc所述

  • 最终,由于线程调度不是JVM的责任,而是由操作系统决定的,因此不能保证所有核心都能被利用

  • 编辑

    我很难把第5分和第6分弄对。正如各种Java 8博客所说,“使用这个新的parallelStream(),您将获得开箱即用的并行处理(免费,您作为应用程序程序员不必担心这一点)”,我在一句话中的问题是:这真的一直正确吗

    这真的一直正确吗

    它在你想要的任何时候都是正确的。序列流也是正常的这一特殊允许是绝对必要的,以使其成为一个有用的特性:在许多情况下(可能是测试、调试等),您需要一个简单的序列流。大多数并发问题都是通过尝试在非并发环境中重现问题来解决的。并发调试要困难得多,首先要确保它确实是需要的

    您不应该担心CPU核心的利用率:这是一种古老而稳定的技术,在我使用Java的所有经验中,它们都得到了利用。如果您的CPU利用率仪表板上缺少一些百分比,您几乎可以肯定,这些问题可以通过优化锁和其他线程协调在Java中解决,而不是完全正确的Java程序成为运行时怪癖的牺牲品

    对于以下几点,我将非常感谢您的反馈 (对/错)

    不幸的是,没有一个答案是对的或错的。它们都是“视情况而定”或“很复杂”。-)

    1:线程是操作系统中最低的调度单元

    这基本上是正确的。操作系统调度线程,Java线程在很大程度上对应于操作系统线程

    然而,还有更多的故事。我鼓励你不要过多地考虑线程。它们是用于构造并行应用程序的非常低级的构造

    当然,可以使用线程编写应用程序,但通常最好使用更高级别的构造。一个这样的构造是一个任务,它是一个特定于应用程序的工作块。如果您可以将工作负载划分为单独的任务,则可以将这些任务提交给,后者将管理任务到线程的调度以及线程的创建和销毁。这是进入JavaSE5的
    java.util.concurrent
    内容

    构造并行应用程序的另一种方法是使用数据并行性。JavaSE7引入了Fork-Join框架。这指的不是线程的分叉和联接,而是任务的分叉和联接,具体地说,是表示数据的可递归拆分部分的任务。FJ框架对于某些工作负载是非常有效的,但是任务的拆分和连接是程序员的责任,这可能会很麻烦

    JavaSE8中的新功能是StreamsAPI,它以更方便的方式支持数据并行

    我已经从你关于线程的问题中推断了很多,但是你的问题似乎集中在线程上,并行性远不止线程。(我的一位同事最近说,“线程是一个虚假的神。”)

    2:单线程程序一次只能在一个内核上运行。所以在一个四元c中