Java параллельный поток для каждого завершения - PullRequest
2 голосов
/ 23 марта 2020

Я хотел бы уточнить поведение Java параллельных потоков. Если бы я использовал параллельный поток, как показано ниже, могу ли я считать его гарантией того, что строка «должно произойти в конце», показанная в приведенном ниже коде, будет напечатана только после выполнения всех параллельных задач?

public static void main(String[] args) {
    Stream.of(1, 2, 3, 5, 7, 8, 9, 10, 11, 23, 399, 939).parallel().forEach(
        integer -> System.out
            .println(Thread.currentThread().getName() + ", for number " + integer));
    System.out.println("Should happen at the end");
}

Повторные испытания всегда печатают «должно произойти в конце», как и ожидалось в конце, как показано ниже. Это может произойти, потому что поток main также используется для обработки нескольких запросов. Возможно ли, что в каком-то сценарии поток main не используется, и в этом случае «должно произойти в конце» будет напечатано до того, как все ForkJoinPool.commonPool-worker завершат выполнение своих задач?

main, for number 7
main, for number 6
ForkJoinPool.commonPool-worker-9, for number 3
ForkJoinPool.commonPool-worker-9, for number 4
ForkJoinPool.commonPool-worker-4, for number 1
ForkJoinPool.commonPool-worker-4, for number 10
ForkJoinPool.commonPool-worker-2, for number 2
ForkJoinPool.commonPool-worker-11, for number 5
ForkJoinPool.commonPool-worker-9, for number 8
main, for number 9
Should happen at the end

1 Ответ

4 голосов
/ 23 марта 2020

Поток Терминальные операции не являются асинхронными. Это означает, что Java вернет управление вызывающему потоку только после завершения forEach . Поэтому то, что вы печатаете после forEach , обязательно печатается после в консоли.

Обратите внимание, однако, что если вы должны использовать java .util.Logger API вместо System.out упорядочение выходных данных не будет таким предсказуемым, поскольку сам API ведения журнала не может (в основном по соображениям производительности) гарантировать упорядочение выходных данных.

Дополнительная литература при потоковых операциях: Oracle официальная документация .

...