Я знаю, что дизайн CompletableFuture
не контролирует его выполнение с перерывами, но, полагаю, некоторые из вас могут столкнуться с этой проблемой. CompletableFuture
- очень хороший способ выполнить асинхронное выполнение, но если вы хотите, чтобы основное выполнение было прервано или остановлено, когда будущее отменено, как мы это сделаем? Или мы просто должны признать, что любой отмененный или выполненный вручную CompletableFuture
не повлияет на поток, работающий там, чтобы завершить его?
То есть, на мой взгляд, очевидно бесполезная работа, требующая времени исполнителя-исполнителя. Интересно, какой подход или дизайн может помочь в этом случае?
ОБНОВЛЕНИЕ
Вот простой тест для этого
public class SimpleTest {
@Test
public void testCompletableFuture() throws Exception {
CompletableFuture<Void> cf = CompletableFuture.runAsync(()->longOperation());
bearSleep(1);
//cf.cancel(true);
cf.complete(null);
System.out.println("it should die now already");
bearSleep(7);
}
public static void longOperation(){
System.out.println("started");
bearSleep(5);
System.out.println("completed");
}
private static void bearSleep(long seconds){
try {
TimeUnit.SECONDS.sleep(seconds);
} catch (InterruptedException e) {
System.out.println("OMG!!! Interrupt!!!");
}
}
}