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