Проблемы отмены качели - PullRequest
2 голосов
/ 30 января 2012

У меня проблемы с отменой свингера.После прочтения документации я не уверен, как подойти к решению этого

sw = new SwingWorker<Object, Void>()
{     
    Object o;
    protected Object doInBackground() throws Exception      
    {          
    //do some long running task via a method call
    } 
}

Тогда в моем обработчике кнопки отмены я просто хочу вызвать sw.cancel(true);

Это, похоже, не работает.В соответствии с документацией качающемуся работнику не нужно, как отменить его.Но если метод запуска Swing Worker вызывается только один раз, то как мне объяснить это с помощью thread.sleep (то, что я прочитал, является одним из способов исправления)

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Swing будет фактически контролировать вашу работу с Future. При попытке отменить рабочий Swing вызовет future.cancel(true) (истинное значение попытается interrupt() исполняющему потоку).

Это означает, что ваша работа должна реагировать на прерывание. Если длительные вычисления не реагируют на прерывание, вам нужно будет установить некоторые контрольные точки и ответить соответственно

protected Object doInBackground() throws Exception      
{          
   //do part 1 of long running task
   if(Thread.currentThread().isInterrupted()){
     //clean up and return
   }
   //do part 2 of long running task
   if(Thread.currentThread().isInterrupted()){
     //clean up and return
   }
   //etc..
} 

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

1 голос
/ 30 января 2012

Здесь есть довольно хорошая статья: http://blogs.oracle.com/swinger/entry/swingworker_stop_that_train

Вкратце, вызов cancel() устанавливает флаг прерывания потока. Если вы выполняете операции ввода-вывода или вызываете Thread.sleep(), тогда флаг проверяется в них, и InterruptedException будет сброшено. Если вы не делаете ни одной из этих вещей, вы можете проверить это самостоятельно, используя Thread.currentThread().isInterrupted() и выбросить исключение.

...