Это слишком долго для комментария, поэтому я делаю его ответом.
Одна из проблем с EDT, которая не обязательно хорошо известна, заключается в том, что во многих случаях Swing должен беззвучно потреблять исключения и перезапускать новый EDT.
Часто ошибочно полагать, что при жизни программы есть один EDT: но это не так. Каждый раз, когда EDT умирает, создается новый EDT.
Люди обычно говорят о "EDT" , как если бы в течение всего времени жизни приложения работал один уникальный EDT, но это не так. Нередки случаи, когда новый EDT запускается несколько раз.
Обратите внимание, что если бы это было не так, все нетривиальные программы Swing не работали бы очень долго, потому что сам Swing API содержит довольно большое количество ошибок, которые делают фактически вызывают исключения и, следовательно, несколько «EDT умирает / новый EDT создан» циклов в течение жизненного цикла приложения.
Цикл "EDT умирает / новый EDT создан" может быть тривиально воспроизведен с помощью специального прерывания EDT:
public void actionPerformed( ActionEvent e ) {
System.out.println( "Thread ID:" + Thread.currentThread().getId() );
System.out.println( 0 / Math.abs(0) );
}
Если вы прикрепите этот ActionListener, скажем, к JButton , вы увидите, что каждый раз, когда вы нажимаете на кнопку, EDT будет иметь новый идентификатор потока.
Тот факт, что нетривиальная программа Swing действительно приводит к аварийному завершению работы EDT из-за ошибки в Java API, можно увидеть, добавив обработчик необработанных исключений по умолчанию (и прочитав огромное количество ошибок Swing, вызывающих исключения в ошибке Sun парад).
Это все скрыто по умолчанию для Java-программистов, потому что, когда происходят эти исключения Swing API, просто запускается новый EDT.
Обратите внимание, что это не меняет того факта, что длительные вычисления должны выполняться вне EDT.