Отмена SwingWorker - PullRequest
       11

Отмена SwingWorker

0 голосов
/ 26 ноября 2018

Я проверял подобные вопросы. Этот очень похож на то, что я хочу спросить, но на самом деле у меня нет ответа.Также Этот вопрос Я проверил.

Вопрос, который у меня есть, заключается в том, что у меня есть SwingWorker, который выполняет длинные процессы в фоновом режиме.

    @Override
   protected final List<Object> doInBackground() throws Exception
   {
    //Should I add if(this.isCancelled) here?
    List<Object> objectList = someFecthingMethod();
    //Should I add if(this.isCancelled) here?
    objectList.forEach(object -> executor.submit(new Helper(object));

    this.latch.await();
    //Should I add if(this.isCancelled) here?
    someOtherLongRunningMethodBasedOnHelperResults();
   }

На пустом местеУ меня есть такой код.Это запускается, когда моя кнопка расчета запускает работника при нажатии.Я также хочу иметь возможность отменить это.Я написал необходимый метод stop(), где у него есть cancel() метод самого работника.

Как показано ниже в моем рабочем классе, у меня есть мой метод остановки, как показано ниже:

@Override
public boolean stop()
{
   return this.cancel( true );
} 

Когда я вызываю этот метод, я регистрирую doInBackground(), this.isCancelled() возвращает true..Но в любом случае он продолжает выполнять методы внутри doInBackground ().Поэтому мой вопрос заключается в том, стоит ли добавлять if(this.isCancelled()) проверку перед каждым методом в doInBackground(), чтобы немедленно остановить его, есть ли лучший способ остановить его выполнение после его отмены?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

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

...