Я написал код, используя потоки java 8 и параллельные потоки для той же функции с пользовательским сборщиком для выполнения функции агрегации.
Когда я вижу использование ЦП с использованием htop
, он показывает, что все ядра ЦП используются как для потоков "потоков", так и для "параллельных потоков". Таким образом, кажется, что когда используется list.stream(), он также использует все процессоры. В чем заключается точная разница между parallelStream() и потоком() с точки зрения использования многоядерных.
Разница между потоками java 8 и параллельными потоками
Ответ 1
Рассмотрим следующую программу:
import java.util.ArrayList;
import java.util.List;
public class Foo {
public static void main(String... args) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
list.add(i);
}
list.stream().forEach(System.out::println);
}
}
Вы заметите, что эта программа будет выводить числа от 0 до 999 последовательно, в том порядке, в котором они находятся в списке. Если мы изменим stream()
на parallelStream()
, это уже не так (по крайней мере на моем компьютере): все числа написаны, но в другом порядке. Итак, по-видимому, parallelStream()
действительно использует несколько потоков.
htop
объясняется тем, что даже однопоточные приложения делятся по нескольким ядрам большинством современных операционных систем (части одного потока могут работать на нескольких ядрах, но, конечно, не в одно и то же время). Поэтому, если вы видите, что процесс использует более одного ядра, это не означает, что программа использует несколько потоков.
Кроме того, при использовании нескольких потоков производительность может не улучшиться. Стоимость синхронизации может нигилировать прирост использования нескольких потоков. Для простых сценариев тестирования это часто бывает так. Например, в приведенном выше примере System.out
синхронизируется. Таким образом, эффективно, только число может быть записано в одно и то же время, хотя используются несколько потоков.