Почему отмена CompletableFuture фактически не прерывает основную задачу? [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему отмена CompletableFuture фактически не прерывает основную задачу? [дубликат]

Сообщение Anonymous »

Вот простой пример:

Код: Выделить всё

public static void main(String[] args) throws Exception {
ExecutorService executorService = Executors.newCachedThreadPool();
CompletableFuture callbackHook = new CompletableFuture();
CompletableFuture future = CompletableFuture.runAsync(() -> {
try {
System.out.println("Starting Runnable");
while (true) {
System.out.println("still running");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
// why is this code never getting hit?
System.err.println("InterruptedException caught in Runnable!");
callbackHook.complete(null);
}
}, executorService);
future.cancel(true);
callbackHook.get(); // this hangs forever...
System.out.println("*** DONE ***"); // this line is never reached
}
Выход:

Код: Выделить всё

Starting Runnable
still running
still running
still running
still running
...(this continues forever)
Почему и почему вызов cancel(true) в CompletableFuture не приводит к запуску прерывания в базовой задаче, даже если параметр true в cancel( true) должен прервать задачу?
И да, я знаю, что этот пример немного надуман, поскольку нет причин, по которым вам обязательно хотелось бы это сделать. ждать callbackHook вместо on в будущем, но есть и более сложные случаи, когда может использоваться такая логика — это всего лишь упрощенный пример.

Подробнее здесь: https://stackoverflow.com/questions/791 ... rlying-tas
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»