Как правильно выполнять длительные операции вне EDT? - PullRequest
3 голосов
/ 17 августа 2010

В настольном приложении Java 1.5 (оно должно работать на многих компьютерах MacOS X, которые из-за политики Apple не увидят 1.6 ВМ), каков правильный способ выполнения длительных вычислений вне EDT?

Скажем, например, когда пользователь нажимает кнопку, которая запускает операцию: я получаю уведомление о EDT и хочу запустить какой-то метод (скажем, crunchData()).

Вот один из способов сделать это:

        final Thread t = new Thread( new Runnable() {
            public void run() {
                crunchData();
            }
        } );
        t.start;

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

Другим способом сделать это было бы иметь другой (не EDT) поток (или пул потоков), всегда работающий, скажем, ожидающий в очереди блокировки и выполняющий, скажем, Runnable , который я будет ставить в очередь везде, где мне нужно выполнить длительную операцию.

Каков правильный способ справиться с этим?

РЕДАКТИРОВАТЬ: Является ли правильный способ иметь дело с чем-то, что просто установить SwingWorker? Как люди справились с этим (что кажется довольно простым) до того, как SwingWorker пришел?

1 Ответ

3 голосов
/ 17 августа 2010

Рекомендуется, чтобы ваш код EDT запустил SwingWorker , который выполнит работу снаружи и вернет вам результат.

...