Наиболее близким к стандартному или готовому способу сделать это является свойство progress
и / или пара методов публикации / процесса, предоставляемая SwingWorker
. Вы можете установить значение «Я закончил» в конце метода, чтобы указать, что фоновая работа выполнена. Поток, ожидающий на рабочем объекте Swing, может выдать сообщение «Отмена ...» и периодически проверять прогресс, чтобы увидеть, достиг ли он завершения. Если ожидающим потоком является колеблющийся EDT, вам потребуется использовать таймер для периодической проверки свойства прогресса и удаления сообщения об отмене по завершении.
Вот пример кода, который запускает упорный фоновый поток, который отменяется, а затем ждет, пока прогресс достигнет 100.
@Test
public void testSwingWorker()
{
SwingWorker worker = new SwingWorker() {
@Override
protected void process(List chunks)
{
for (Object chunk : chunks)
{
System.out.println("process: "+chunk.toString());
}
}
@Override
protected void done()
{
System.out.println("done");
}
@Override
protected Object doInBackground() throws Exception
{
// simulate long running method
for (int i=0; i<1000000000; i++)
{
double d = Math.sqrt(i);
}
System.err.println("finished");
publish("finished");
setProgress(100);
return null;
}
};
Thread t = new Thread(worker);
t.start();
try
{
worker.get(1, TimeUnit.SECONDS);
}
catch (InterruptedException e) {
}
catch (ExecutionException e) {
}
catch (TimeoutException e) {
}
worker.cancel(true);
// now wait for finish.
int progress = 0;
do
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
}
progress = worker.getProgress();
System.out.println(String.format("progress %d", progress));
}
while (progress<100);
}
Альтернативный подход - использовать пары методов publish\process
, чтобы выдвинуть специальное значение, указывающее, что фоновая нить завершилась в EDT. Затем ваш метод переопределения process
в SwingWorker получает это специальное значение и скрывает сообщение «Отмена ...». Преимущество этого в том, что опросы или таймеры не нужны. Пример кода показывает, что, хотя done
вызывается, как только задача отменяется, пары методов публикации / процесса все еще работают, даже когда задача отменяется.