Java Spring: отмена будущего

1

У меня есть метод, который создает будущее:

@Service
public class TestService {
    @Async
    public Future<TestClass> testCancelFuture() throws InterruptedException  {
        TestClass testClass = new TestClass();
        testClass.loop();
        return new AsyncResult<TestClass>(testClass);
    }
}

И это мой TestClass

public class TestClass {
    public void loop() throws InterruptedException  {
        for (int i=0; i<100; i++) {
            System.out.println("[" + i + "] loop");
            Thread.sleep(1000);
        }
    }
}

Теперь я вызываю метод testCancelFuture и отменяю его:

@Controller
@RequestMapping("/test")
public class TestController() {
    @Autowired
    TestService testService;

    @RequestMapping(method = RequestMethod.GET) 
    public String testMethod () throws InterruptedException {
        Future<TestClass> test = testService.testCancelFuture();
        test.cancel(true);
        return "test";
    }
}

Я бы ожидал, что цикл остановится, так как я отменил будущее вскоре после его запуска. Однако цикл продолжается. Итак, как я могу остановить цикл в будущем?

  • 0
    опубликовать код метода cancel()
  • 1
    Отмена () вряд ли гарантирована после начала.
Показать ещё 4 комментария
Теги:
spring

1 ответ

3
Лучший ответ

Отмена/прерывание выполняемой задачи никогда не гарантируется. Прочитайте описание метода Thread.interrupt():

Если этот поток заблокирован при вызове методов wait(), wait (long) или wait (long, int) класса Object или join(), join (long), join (long, int), sleep (long) или sleep (long, int), методы этого класса, то его статус прерывания будет очищен, и он получит InterruptedException.

Если этот поток заблокирован в операции ввода-вывода по прерываемому каналу, тогда канал будет закрыт, статус прерывания потока будет установлен, и поток получит исключение ClosedByInterruptException.

Если этот поток заблокирован в Селекторе, тогда будет установлен статус прерывания потока, и он немедленно вернется из операции выбора, возможно, с ненулевым значением, как если бы был вызван метод пробуждения селектора.

Если ни одно из предыдущих условий не будет выполнено, этот статус прерывания потока будет установлен.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню