Вы должны думать о двух потоках как о двух отдельных программах, но с одинаковыми переменными.
Поток 1 состоит из всего, что не имеет отступа в вашем коде. Он запускает поток, затем ждет ввода пользователя, затем выводит «контрольную точку». Тогда это сделано.
Поток 2 состоит из функции check.
Он проверяет, не является ли переменная None. Если это произойдет, это сделано. Если этого не произойдет в течение трех секунд, будет напечатано «слишком медленно», и теперь все готово.
Ни один из потоков не "знает", что делает другой, за исключением того, что у них одна переменная, answer.
Программа в целом завершит работу, когда все ее потоки будут завершены.
Вот и все. Это то, что вы написали. Поэтому, если вы что-то печатаете, программа завершается, потому что поток 1 всегда будет выходить после того, как вы что-то наберете. Поток 2 завершается, как только видит, что переменная не None.
Если вы ничего не наберете, Тема 1 просто будет сидеть и ждать вас вечно. Вот как работает функция ввода. Поток 2 выйдет через 3 секунды или менее, но это не влияет на Поток 1.
Вы не можете выбросить исключение из одного потока в другой. Таким образом, вы не можете выбросить исключение из потока 2 и обработать его потоком 1.
Вы пытались что-то набрать ПОСЛЕ сообщения «слишком медленно»? Когда вы это сделаете, поток 1 (и, следовательно, ваша программа) выйдет.
Суть в том, что вы не можете использовать функцию ввода в подобных случаях, потому что эта функция блокирует поток своего потока, пока пользователь что-то не введет. Никакой другой поток не может ничего сделать, чтобы он продолжался.