Согласно JavaDoc, при вызове get(timeout, unit)
возможно 4 исключения:
CancellationException
- если это будущее было отменено ExecutionException
- если это будущее завершено исключительно InterruptedException
- если текущий поток был прерван во время ожидания TimeoutException
- если время ожидания истекло
ExecutionException
является наиболее простым: будущее завершено без исключения, что обычно означает, что задача завершилась с выдачей исключения (но это также может означать, что что-то еще завершило будущее с исключением).
последние 2 относятся к ожиданию самого вызова get()
и указывают только на то, что будущее не было завершено, когда возникло исключение.
CancellationException
указывает, что будущее было cancel()
ed, но не указывает, выполняется ли задание по-прежнему.
Дело в том, что вызов cancel(boolean)
по умолчанию не отменяет запущенное задание, даже когда аргументэто true
:
Параметры
mayInterruptIfRunning
- это значение не действует в этой реализации, поскольку прерывания не используются для управления обработкой.
Таким образом, по умолчанию не имеет значения, вызываете ли вы cancel()
или нет, потому что это не повлияет на текущее задание.
Если вы хотите остановить запущенное задание, вам необходимо реализоватьконкретный механизм поддержки его в методе, который создает CompletableFuture
(здесь doSomething()
). Например, он может проверить, отменено ли возвращенное будущее, или предоставить какой-то другой механизм обратного вызова, чтобы остановить выполнение (например, установив где-нибудь флаг stop
).