Темы в GUI (Swing) - приложение размораживается - PullRequest
1 голос
/ 22 февраля 2011

У меня есть вопрос, касающийся потоков в приложении Java Swing.В моем приложении есть модуль, который получает и отправляет сообщения электронной почты.Я хочу назначить действие кнопке (mouseClicked) для получения непрочитанных писем.

Псевдокод:

ExchangeConnector ec = new ExchangeConnector();
ArrayList<Mail> unreadMails = ec.receive(Mail.UNREAD);
// (...)
ec.close();

Моя текущая реализация останавливает приложение до тех пор, пока его получение не будет завершено (иногда это может занять более 10 минут).

Вопрос в том, как сделать его полностью "в фоновом режиме", чтобы мое приложение можно было использовать для других действий?

Ответы [ 3 ]

5 голосов
/ 22 февраля 2011

Посмотрите на SwingWorker для выполнения подобных действий с помощью Swing Thread.

SwingWorker:

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

2 голосов
/ 22 февраля 2011

Йохан Шёберг дал подсказку: поместите долгосрочное задание в поток.Кроме того, я хочу добавить: не запускайте разные потоки (если вам это действительно не нужно), а вместо этого используйте один выделенный рабочий поток для таких операций.Иначе ты потеряешься в нитке-нирванеСледить за двумя потоками (потоком отправки события и рабочим потоком) намного проще.

1 голос
/ 22 февраля 2011

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

new Thread(new EmailReceiver(new ExchangeConnector())).start();

И EmailReceiver

public class EmailReceiver implements Runnable {
     private ExchangeConnnector ec;

     public EmailReceiver(ExchangeConnector ec) {
         this.ec = ec;
     }

     @Override
     public void run() {
         ec.receive(Mail.UNREAD);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...