Выполнение SwingWorker из SwingWorker - ждет, пока первый не остановится

Я пытаюсь выполнить 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?


person RemiX    schedule 08.06.2010    source источник


Ответы (1)


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

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

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

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

person ddimitrov    schedule 08.06.2010