Выполнение SwingWorker из SwingWorker - ждет, пока первая остановится - PullRequest
2 голосов
/ 08 июня 2010

Я пытаюсь запустить SwingWorker (SubWorker) из другого SwingWorker (MainWorker), а затем я хочу, чтобы MainWorker дождался завершения SubWorker. В то же время MainWorker должен обновить себя в соответствии с изменениями свойств SubWorker.

public class MainWorker extends SwingWorker<Void,Void>
{
    public Void doInBackground()
    {
        SubWorker sw = new SubWorker();
        sw.execute();
        try {
            network.get(); // wait for completion
        } catch (Exception ex) {
        }
        return null;
    }
}

Проблема в том, что метод doInBackground SubWorker не вызывается до тех пор, пока MainWorker не завершит работу, в то время как MainWorker ожидает завершения работы SubWorker.

Как я могу позволить SubWorker работать параллельно с деятельностью MainWorker?

1 Ответ

3 голосов
/ 08 июня 2010

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

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

Основной (или, точнее, единственный) SwingWorker будет брать элементы из этой очереди и обновлять графический интерфейс, используя методы publish () / process (). Когда подзадача заканчивает работу, она может выдвинуть специальный токен в очередь (или ноль). Вот как вы можете отслеживать невыполненные подзадачи и решать, когда завершить цикл.

В качестве альтернативы, если у вас есть куча автономных задач, вы можете использовать CompletionService и обновить состояние аналогичным образом с ПО.

...