Это возможно сделать с коллектором, который затем создает новый поток:
class Accumulator {
public static void accept(List<Integer> list, Integer value) {
list.add(value + (list.isEmpty() ? 0 : list.get(list.size() - 1)));
}
public static List<Integer> combine(List<Integer> list1, List<Integer> list2) {
int total = list1.get(list1.size() - 1);
list2.stream().map(n -> n + total).forEach(list1::add);
return list1;
}
}
Это используется как:
myIntStream.parallel()
.collect(ArrayList<Integer>::new, Accumulator::accept, Accumulator::combine)
.stream();
Надеюсь, вы увидите, что важный атрибут этого коллектора заключается в том, что даже если поток параллелен, когда экземпляры Accumulator
объединены, он корректирует итоговые значения.
Это, очевидно, не так эффективно, как операция карты, потому что он собирает весь поток и затем создает новый поток. Но это не просто деталь реализации: это необходимая функция того, что потоки предназначены для потенциальной параллельной обработки.
Я протестировал ее с помощью IntStream.range(0, 10000).parallel()
, и она функционирует правильно.
Я не уверен, что эти термины используются всеми последовательно, но по моему опыту, различие заключается в том, что гипервизор - это низкоуровневое программное обеспечение, которое осуществляет прямой контроль над виртуальными машинами, включая управление состоянием процессора, гостевой вход / выход, защита памяти и т. д. VMM - это компонент, который виртуализирует системные ресурсы для гостя, включая виртуальные устройства (например, хранилище, сеть и графику), и распределение гостевой памяти. VMM может работать в самой гостевой системе и в пользовательском режиме. Может быть отдельный экземпляр VMM для каждого гостя, но в системе есть только один гипервизор (за исключением некоторых сложных ситуаций, в которые я не буду вдаваться). Детали того, какой компонент отвечает за то, что сильно зависит от реализации, и в некоторых архитектурах VMM они могут быть одним и тем же компонентом, поэтому его можно назвать любым именем.
Не читал книгу, поэтому не может комментировать, если вы не дадите какую-то конкретную выдержку из книги.
В общем, VMM относится к диспетчеру виртуальных машин, который является инструментом для управления виртуальной машиной с некоторого сервера (гипервизора), локального / удаленного.
Гипервизор, с другой стороны, относится к разделителю, который способен запускать на них виртуальные машины.