Я планирую сделать внутреннюю презентацию в своей компании о новых функциях и концепциях на Java 8.
Я хотел бы сосредоточиться на возможностях параллельной обработки новых библиотек коллекции.
Где бы я ни читал о Java 8 и о необходимости использования итераторов более функционального стиля библиотеки коллекций, упоминается, что это поможет использовать многоядерные серверы, которые в настоящее время нормальны. Но очень редко упоминается, как это стало возможным, и является ли это универсальной истиной, не говоря уже о каких-либо тестах на производительность.
Как даже опытные разработчики в моей компании, которые утверждают, что знают о потоках, не имеют понятия, как фактическая потоковая обработка работает на более низком уровне, я пытаюсь собрать некоторые знания в этой области. Я сделал ряд следующих утверждений, основанных на чтении нескольких блогов и т.д.
Я был бы благодарен за некоторые отзывы за следующие пункты (true/false)..
-
Нить - это самая низкая единица планирования в ОС (да, базовый материал, но не все программисты приложений знают это;))
-
Однопоточная программа может работать только по одному ядру за раз. Так, например, в четырехъядерном процессоре 75% CPU не используется.
-
Проблема с нынешним итератором Java-коллекции заключается в том, что он является внешним итератором, и невозможно (по крайней мере, из коробки) распространять массивную итерацию коллекции на несколько потоков. Новые функции библиотеки коллекции позволяют иметь concurrency, не имея необходимости решать проблемы с низким уровнем concurrency
-
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); })
-
Но для того, чтобы parallellize вышеупомянутой итерации, нужно явно использовать метод
parallel()
Stream API
private static void printUsingCoolLambda (final List<String> names) { names.parallelStream().forEach(s -> System.out.println(s)); System.out.println("Printed using printUsingCoolLambda"); }
Но даже тогда нет никакой гарантии, что операция будет выполняться параллельно, поскольку Javadoc из
parallelStream()
говорит следующее "Возвращает возможно параллельный {@code Stream} с этой коллекцией в качестве ее источника. Это разрешено для этого метода возвращать последовательный поток" -
В конечном счете, нет гарантии, что все ядра будут использоваться, поскольку планирование потоков не является ответственностью JVM, скорее диктуемой ОС.
изменить
Мне больше всего сложно получить очки 5 и 6. Поскольку в различных блогах Java 8 говорится, что "используйте этот новый параллельный поток(), и вы получите параллельную обработку из коробки (бесплатно, а вы, как программист, освобождаетесь от необходимости беспокоиться об этом)", мой вопрос в одном предложении было бы , это действительно правильно все время?