Дождитесь окончания работы SwingWorker - PullRequest
6 голосов
/ 13 ноября 2011

Я хочу дождаться окончания работы моего SwingWorker, а затем я хочу запустить еще один SwingWorker. В этом случае Encrypteer3 - это класс, расширяющий SwingWorker.

Мой код:

    input = txtTekst.getText();
    key = txtKey.getText();
    System.out.println("thread1 start");
    Encrypteer3 a = new Encrypteer3();
    a.execute();
    while(a.isDone()==false){
        // do nothing
    }
    input = output;
    key = txtKey1.getText();
    System.out.println("thread2 start");
    Encrypteer3 b = new Encrypteer3();
    b.execute();
    while(b.isDone()==false){
        // do nothing
    }

Это приводит к зависанию моего графического интерфейса и использованию большого количества процессоров (при выполнении этого Java использует около 95% процессоров). Я думаю, что проблема в том, что он постоянно проверяет, завершен ли поток, и это делает его настолько загружающим процессор.

В классе SwingWorker нет метода join (). Как я могу сделать это менее интенсивным процессором?

Ответы [ 3 ]

3 голосов
/ 13 ноября 2011

вам необходимо переопределить done метод из SwingWorker.

Из документации SwingWorker # done ()

Выполнено в событииОтправка потока после завершения метода doInBackground.Реализация по умолчанию ничего не делает.Подклассы могут переопределить этот метод для выполнения действий завершения в потоке диспетчеризации событий.Обратите внимание, что вы можете запросить статус внутри реализации этого метода, чтобы определить результат выполнения этой задачи или отменить ее.

public class Encrypteer3 extends SwingWorker<Void, Void>{

    @Override
    protected Void doInBackground() throws Exception {
        // background task
        return null;
    }

    @Override
    protected void done() {
        // will be executed when background execution is done
    }

}

и его while(a.isDone()==false) {, выполнение которого требует времени.

while(a.isDone()==false) {
    // do nothing
}
3 голосов
/ 13 ноября 2011

Я думаю, что использование пустого цикла - плохая идея, SwingWorker имеет

protected  void done()

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

0 голосов
/ 13 ноября 2011
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker.

лучше, чем проверка if(isDone) будет реализовано Исполнитель , но во всех случаях (имеется в виду SwingWorker) вы должны проверить этот поток , как получить исключение (с)) из вложенного метода (ов)

...