Что выведет код Junior Потоки и Java Memory Model обновлено

Что выведет: join и общий список

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

import java.util.*;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        List<String> log = Collections.synchronizedList(new ArrayList<>());
        Thread t = new Thread(() -> {
            log.add("worker");
            throw new IllegalStateException("fail");
        });
        t.setUncaughtExceptionHandler((th, e) -> log.add("handler " + e.getMessage()));
        log.add("before");
        t.start();
        t.join();
        log.add("after");
        System.out.println(log);
        System.out.println(t.getState());
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: [before, worker, handler fail, after], TERMINATED. before добавляется до start.

Что выведет

[before, worker, handler fail, after]
TERMINATED

Разбор

before добавляется до start. Поток пишет worker и падает, его обработчик выполняется в том же потоке до завершения. join() дожидается конца потока, включая обработчик, поэтому after всегда последний. Исключение не попадает в main, поток просто в состоянии TERMINATED.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме