# 1 и # 2 одинаковы. Вы должны использовать номер 1, так как это хорошо известная часть API.
Используете ли вы # 1 или # 3, зависит от следующего:
Вносит ли он изменения в пользовательский интерфейс или поддерживаемые модели?
Если да, используйте # 1.
Это длительная задача:
Если да, используйте № 3.
Если это долгосрочная задача, которая в конечном итоге изменит пользовательский интерфейс или его модель поддержки, выполните долгосрочную задачу в отдельном потоке, а затем вызовите incokeLater для обновления пользовательского интерфейса.
Кроме того, вместо создания нового потока каждый раз используйте ExecutorService, чтобы вы могли повторно использовать потоки.
Это может быть немного сложнее, например, если вы в данный момент находитесь в потоке событий (то есть: в ActionListener.actionPerformed()
, то вам не нужно (как и не должно) вызывать invokeLater, но суть этого там.