Качать и обрабатывать нити - PullRequest
2 голосов
/ 05 июня 2010

В StackOverflow есть пара вопросов на тему потоков с API-интерфейсом Swing, но вещи до сих пор не ясны. В чем проблема с EDT, как правильно запустить Thread с Swing и в каких случаях его следует использовать?

P.S: Любые источники с точки зрения передовой практики будут оценены.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Ознакомьтесь с руководством по Java в потоке рассылки событий здесь и здесь . Таким образом, поток рассылки событий - это место, где обрабатываются все события пользовательского интерфейса. Это позволяет всему коду, управляющему пользовательским интерфейсом, существовать в одном потоке (EDT) и, следовательно, устранять любые проблемы безопасности потока.

1 голос
/ 05 июня 2010

Это слишком долго для комментария, поэтому я делаю его ответом.

Одна из проблем с 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.

1 голос
/ 05 июня 2010

Я бы, вероятно, начал с SwingWorker .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...