Потоки в Java Swing, обзор трех подходов в приложении - PullRequest
4 голосов
/ 15 июня 2011

Я использую приведенный ниже код в настольном свинг-приложении, и у меня нет большого опыта с нитями, потому что я обычный веб-программист, и заниматься свингом не моя конфетка ...

Я хочу знать, есть ли лучший подход к управлению моими 3 задачами, и мне нужно запустить их параллельно для потока в моем приложении.

    SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            task 1                
         }
    });


    Runnable r;
    r = new Runnable() {

        public void run() {
            task 2                  
        }
    };
    EventQueue.invokeLater(r);


    Thread worker = new Thread() {

        public void run() {
            task 3                 
        }
    };

    worker.start();

Спасибо!

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

# 1 и # 2 одинаковы. Вы должны использовать номер 1, так как это хорошо известная часть API.

Используете ли вы # 1 или # 3, зависит от следующего:

Вносит ли он изменения в пользовательский интерфейс или поддерживаемые модели? Если да, используйте # 1.

Это длительная задача: Если да, используйте № 3.

Если это долгосрочная задача, которая в конечном итоге изменит пользовательский интерфейс или его модель поддержки, выполните долгосрочную задачу в отдельном потоке, а затем вызовите incokeLater для обновления пользовательского интерфейса.

Кроме того, вместо создания нового потока каждый раз используйте ExecutorService, чтобы вы могли повторно использовать потоки.

Это может быть немного сложнее, например, если вы в данный момент находитесь в потоке событий (то есть: в ActionListener.actionPerformed(), то вам не нужно (как и не должно) вызывать invokeLater, но суть этого там.

6 голосов
/ 15 июня 2011

Что вы пытаетесь сделать? Работает ли ваш поток в Swing GUI или он не зависит от GUI?

Вы должны использовать invokeLater(), если поток что-то делает с пользовательским интерфейсом Swing, потому что это можно сделать только из Поток диспетчеризации событий . Качели однопоточные. (Ваши задачи 1 и 2)

Если вы делаете что-то полностью в фоновом режиме, например написание большого XML-файла, который можно сделать в фоновом режиме thread . (Ваша задача 3) Но вы все равно можете общаться с Swing GUI, используя invokeLater().

Другой вариант - если вы хотите регулярно запускать поток, например, Каждую 5-ю минуту вы можете использовать TimerTask . Или, если он не зависит от графического интерфейса Swing java.util.TimerTask .

Параллельность в Swing , возможно, стоит прочитать:

Программист Swing имеет дело со следующими видами потоков:

  • Начальные потоки , потоки, которые выполняют начальный код приложения.
  • Поток отправки событий , где выполняется весь код обработки событий. Большая часть кода, взаимодействующего с платформой Swing, также должна выполняться в этом потоке.
  • Рабочие потоки , также известные как фоновые потоки, в которых выполняются трудоемкие фоновые задачи.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...