Что выведет код 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 ошибок.