Подтвердить что ты не робот

Разница между потоками java 8 и параллельными потоками

Я написал код, используя потоки java 8 и параллельные потоки для той же функции с пользовательским сборщиком для выполнения функции агрегации. Когда я вижу использование ЦП с использованием htop, он показывает, что все ядра ЦП используются как для потоков "потоков", так и для "параллельных потоков". Таким образом, кажется, что когда используется list.stream(), он также использует все процессоры. В чем заключается точная разница между parallelStream() и потоком() с точки зрения использования многоядерных.

4b9b3361

Ответ 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 синхронизируется. Таким образом, эффективно, только число может быть записано в одно и то же время, хотя используются несколько потоков.