【发布时间】:2014-03-14 05:43:23
【问题描述】:
我计划在我的公司就 Java 8 的新特性和概念进行内部演示。
我想关注的是新馆藏库的并行处理能力。
无论我在哪里读到 Java 8 以及对集合库的更多功能样式迭代器的需求,都提到这将有助于利用多核服务器这在当今很正常。但很少有人提到这是如何实现的,以及这是否是普遍真理,更不用说任何性能基准了。
由于即使是我公司中声称了解线程的经验丰富的开发人员也不知道实际线程在较低级别是如何工作的,因此我正在尝试收集这方面的一些知识。我根据阅读几个博客等做出了以下断言。
感谢您对以下几点的反馈(真/假)..
线程是操作系统中最低的调度单元(是的,基本的东西,但并非所有应用程序员都知道这一点 ;-))
单线程程序一次只能在一个内核上运行。所以在四核 CPU 中,例如 75% 的 CPU 没有被利用。
当前 Java 集合迭代器的问题在于它是一个外部迭代器,并且不可能(至少开箱即用)将庞大的集合迭代分发到多个线程。新的集合库操作可以在不需要处理低级并发问题的情况下实现并发
-
Java 8 使得使用增强的集合库使用内部迭代器并行化迭代成为可能
而不是 Java 7
for (Shape s : shapes) {if (s.getColor() == RED)s.setColor(BLUE); }我们在 Java 8 中拥有
shapes.forEach(s -> { if (s.getColor() == RED) s.setColor(BLUE); }) -
但为了并行化上述迭代,必须显式使用
Stream API的parallel()方法private static void printUsingCoolLambda (final List<String> names) { names.parallelStream().forEach(s -> System.out.println(s)); System.out.println("Printed using printUsingCoolLambda"); }但即使那样,也不能保证操作会并行完成,因为
parallelStream()的 Javadoc 说以下"Returns a possibly parallel {@code Stream} with this collection as its source. It is allowable for this method to return a sequential stream" 最终,无法保证所有内核都会被利用,因为线程调度不是 JVM 的职责,而是由操作系统决定的。
编辑
我最难正确理解第 5 点和第 6 点。正如各种 Java 8 博客所说,“使用这个新的 parallelStream(),您将获得开箱即用的并行处理(免费,作为应用程序程序员,您不必担心这一点)”,我一句话的问题应该是那真的一直都是正确的吗?
【问题讨论】:
-
JVM 线程不一定映射到 OS 线程。 JVM 完全自己做一些线程调度。
-
这一切似乎都没有问题;要求对小论文提供一般性反馈并不适合 SO 格式。
-
我认为 JVM 使用了一些本机操作系统级别的能力来实现多线程,但只有这些能力非常依赖于操作系统
-
@BobbyDigital 我认为您没有理解这种变化的主要意义:转换后收集处理可以自动并行化。这不仅是一个巨大的胜利,而且实际上也是将 lambdas 引入 Java 的原因。他们需要一个非常强大的杀手级功能来推动他们的发展。
-
@BobbyDigital 不,这次不是。就个人而言,我认为这种变化非常令人兴奋。它不仅会改变 Java 代码的外观(这是泛型所做的唯一事情),还会改变其基本的语义,而且这种改变正朝着如此伟大而重要的方向发展。并行性每天都在变得越来越热,当语言调整伴随着这个新要求时,Java 就在那儿。
标签: java multithreading concurrency parallel-processing java-8