Как ждать результата от EDT? - PullRequest
0 голосов
/ 22 января 2011

Для тестирования я хочу запустить процесс на свинг-редакторе и ждать результата.

Обычно я делаю это с помощью invokeAndWait.Но, возможно, возможно ли использовать FutureTask и запустить эту задачу на EDT ??

Возможно ли это, и есть ли у вас пример (моей) идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 марта 2011

Хорошо, что вы знаете, что манипулирование компонентом Swing должно выполняться в потоке диспетчеризации событий, но простой ответ - нет , вы никогда не захотите запускать долгосрочную задачу или ждать блокировок, находясь EDT. EDT всегда должен оставаться очень отзывчивым. Кроме того, кроме этого, invokeAndWait() не может быть вызвано из EDT по очевидным причинам.

Взгляните на эту старую статью о Threads и Swing - основные принципы все еще применяются.

Вам доступно несколько вариантов. Вы можете просто создать новый Thread, Runnable или FutureTask для запуска на Executor и вызывать invokeAndWait() только когда это необходимо для обновления компонентов (но если вам это удастся, invokeLater() лучше). Вы также можете использовать SwingWorker (также в статье), который предоставляет дополнительные полезные способы взаимодействия между вашим потоком и EDT с надлежащей степенью разделения.

0 голосов
/ 22 января 2011

EventQueue.invokeAndWait ведет себя так же, как замок.Замок с ужасным количеством внутри, что противоречит обычному совету:Поэтому он может вызывать взаимоблокировки, и я бы рекомендовал избегать его.

Запустите задачу в EDT с EventQueue.invokeLater.Пусть эта задача запустит задачу в вашем потоке, используя очередь задач.(Избегайте только статики, и я предлагаю использовать нестатическую оболочку около invokeLater, чтобы вы могли тестировать и отслеживать).

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