Этот код имеет большую проблему, даже без параллельного: После .distinct(), поток будет иметь только 2 элементы- поэтому предел никогда не пинает не- он будет печатать эти два элемента, а затем продолжить теряя время вашего процессора на неопределенное время. Возможно, это было то, что вы намеревались.
С параллелью и ограничением, я считаю, что проблема усугубляется из-за того, как работа делится. Я не прослеживал весь путь через параллельный поток кода, но здесь есть моя догадка:
Параллельный код делит работу между несколькими потоками, которые все повторяются бесконечно, поскольку они никогда не заполняют свою квоту. Система, вероятно, ждет завершения каждого потока, чтобы он мог комбинировать свои результаты, чтобы обеспечить четкость по порядку, но это никогда не произойдет в том случае, если вы предоставите.
Без требования к порядку результаты каждого рабочего потока могут быть немедленно использованы после проверки на глобальный набор различий.
Без ограничений я подозреваю, что для обработки бесконечных потоков используется другой код: вместо того, чтобы ждать заполнения 10, результаты сообщаются как обнаруженные. Его немного похоже на создание итератора, который сообщает hasNext() = true, сначала производит 0, затем 1, затем следующий() вызов вешает вечно без создания результата - в параллельном случае что-то ждет несколько отчетов, чтобы он мог правильно комбинировать/заказывайте их перед выводом, в то время как в серийном случае он делает то, что он может затем висит.
Попытайтесь найти точную разницу в стеке вызовов с и без отдельных() или limit(), но пока очень сложно перемещаться по довольно сложной последовательности вызовов библиотеки потоков.
На моей машине это блокирует 3/4 ядра при 100% использовании ЦП без получения ответа! Я думаю, что это может быть ошибкой во взаимодействии между пределом и параллелью. – Straw1239
@ Straw1239 - согласитесь, что это должно считаться ошибкой; нет очевидной причины, почему этот код не печатает что-то быстро. – ZhongYu
Он пытается буферизировать содержимое всего потока в 'distinct' op. Это происходит даже без «предела». Хотя ясно, что потоки, обрабатывающие последующие куски, должны ждать своего предыдущего для упорядоченного потока, первый не нужно ждать ... – Holger