. Ближайшее к стандартному или готовому способу это progress
свойство и/или пара методов публикации/процесса, предоставленные SwingWorker
. Вы можете установить это значение «Я закончил» в конце метода, чтобы указать, что фоновая работа выполнена. Поток, ожидающий рабочего качателя, может вывести сообщение «Отмена ...» и периодически проверять ход выполнения, чтобы убедиться, что он достиг завершения. Если ожидающий поток - это качающийся 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
вызывается, как только задача отменяется, пары метода публикации/процесса все еще работают, даже когда задача отменяется.
Обе эти идеи вещи, которые я до сих пор не считается , Мне не нравится использовать прогресс по той же причине, которую вы указали, - это требует опроса. Мне нравится идея публикации/процесса по большей части, но она связывает логику, которую я хочу сделать, когда задача _actually_ закончена для самого класса SwingWorker. По той же причине я редко использую метод «done()» и вместо этого вместо этого добавляю слушателей к рабочему объекту. –
Я согласен с вами, опубликовать/обрабатывать лучше всех. Что касается соединения, вы можете отделить его, создав подкласс SwingWorker, который переопределяет метод процесса, прослушивает значение «Я сделан» и уведомляет зарегистрированных слушателей о том, что фоновая задача действительно выполнена. Это отделяет логику от рабочего качания. – mdma
Правда, но как же тогда объект прослушивания будет блокироваться, пока не получит уведомление? –