Ожидание потока AWT Event Dispatcher Thread с многопоточностью - PullRequest
2 голосов
/ 17 февраля 2011

Есть ли способ заблокировать выполнение на EDT, при этом все еще имея яркий графический интерфейс?

Я заметил, что JDialog / JOptionPane имеет нечто подобное при вызове setVisible (true).

Зачем мне это нужно?

Мой класс должен удовлетворять следующему интерфейсу:

interface Quitable {
   boolean quit();
}

Мой класс нуждается в реализации, подобной этой:

class MyApp implements Quitable {
    ExecutorService executor = Executors.newCachedThreadPool();
   // ...
   public boolean quit() {
           FuturTask<Boolean> futureTask = new FutureTask<Boolean>(saveJob);
           executor.execute(futureTask);
           // TODO: keep gui vivid
           boolean saveResult = futureTask.get();
           return saveResult;
   }
   // ...
}

Мне нужно вернуть результат процесса сохранения (который может занять некоторое время и может дать сбой). Или вы бы предложили другое решение? Спасибо за любые идеи. ;)

Ответы [ 2 ]

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

Dialog заставляет цикл события выполняться, пока он блокируется.Существует фильтр, который пропускает определенные события через диалоговое окно, такие как запросы на перерисовку, события вызова и события.API для этого не раскрывается.

Была библиотека ( Foxtrot , IIRC), которая использовала хак для Dialog, чтобы раскрыть это поведение.настоятельно рекомендую структурировать вашу программу таким образом, чтобы это не требовалось.Это очень процедурная, а не управляемая событиями организация.Поэтому поставьте свою задачу в очередь в другом потоке (возможно, в пуле потоков / службе исполнителя или в виде GUI-подобного цикла обработки событий), а затем обновите графический интерфейс с помощью java.awt.EventQueue.invokeLater.

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

JDialog не блокирует выполнение EDT, EDT игнорирует события, кроме события jDialog, когда он открывается как модальный.

Я предлагаю вам показать прогрессбар как модальный, прежде чем вызывать метод quit.

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