Посмотрите на этот пример:Как отменить отмену задачи после отмены услуги # отменить?
package sample;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.stage.Stage;
public class Main extends Application {
//NOTICE: This is class in **other file** (here is just for example)
private static class MyService extends Service {
@Override
protected Task createTask() {
return new Task() {
@Override
protected Object call() throws Exception {
System.out.println("Service: START");
while(true) {
System.out.println("Service: ITERATION");
// Thread.sleep(3000); // This raise InterruptedException after cancel, but how about such code (it won't raise exception):
for(long i = 0; i < 1_000_000_000; i++) {
}
if (isCancelled())
break;
}
System.out.println("Service: END");
return null;
}
};
}
}
@Override
public void start(Stage primaryStage) throws Exception {
MyService myService = new MyService();
myService.start();
Thread.sleep(5000);
myService.cancel();
System.out.println(myService.getState()); // Here is `CANCELLED` already but task isn't finished yet.
// <--- How to wait cancellation of Task here?
System.out.println("This command must be called after `Service: END`");
Platform.exit();
}
public static void main(String[] args) {
launch(args);
}
}
Как известно, вызов Service#cancel
не ждать отмены Task
. Итак, я хочу заблокировать основной поток и ждать отмены Task
. Как мне это сделать?
P.S.
Похож, что Service
не предоставляет обработчик обратного вызова/события для проверки реального аннулирования Task
. Это правильно?
Проверьте свое решение в моем примере. Вы увидите, что этот обратный вызов вызывается после 'cancel', но задача по-прежнему не отменяется/не завершается. Итак, я хочу найти подходящее решение для ожидания отмены задачи. Постскриптум Я знал, какой блок основного потока - плохая идея, но в моем случае это может быть подходящее решение. –
Работает отлично для меня ... Я обновлю полный код. –
Ваше решение не печатает 'Сервис: END'. Это означает, что Задача не отменена/завершена, но состояние службы уже установлено CANCELED. Думаю, теперь вы понимаете проблему. –