Java CompletableFuture不取消底层执行



我期望从下面的代码,由于超时completablefutures将停止处理。但是我可以看到取消没有效果。

public class CompletableFutureTest {
public static void main(final String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(10);
CompletableFuture completableFuture;
CompletableFuture completableFuture2;
completableFuture =
CompletableFuture.runAsync(() -> callSomeMethod(1), executor);
completableFuture2 =
CompletableFuture.runAsync(() -> callSomeMethod(2), executor);
try {
System.out.println("After everything");
completableFuture.get(2, TimeUnit.SECONDS);
completableFuture2.get(2, TimeUnit.SECONDS);
} catch (ExecutionException e) {
cancelCompletableFuture(completableFuture);
cancelCompletableFuture(completableFuture2);
}  catch (TimeoutException e) {
cancelCompletableFuture(completableFuture);
cancelCompletableFuture(completableFuture2);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
private static void callSomeMethod(int i) {
System.out.println("In some method" + i);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("Interrupted");
}
System.out.println("After sleep" + i);
}
private static void cancelCompletableFuture(CompletableFuture completableFuture) {
completableFuture.cancel(true);
}

}

我可以看到两个可完成的期货还在运行。

CompletableFuture的javadoc有你的问题的答案,特别是对cancel方法的mayInterruptIfRunning参数的注释:

mayinterruptirunning -这个值在这个实现中没有作用,因为中断不是用来控制处理的。

最新更新