Java DeleverableFuture不取消基础执行
我希望从以下代码中,由于超时,完整的图将停止处理。但是我可以看到,取消没有效果。
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);
}
}
我可以看到2个完整的期货仍在运行。
I am expecting that from the below code, due to timeouts the completablefutures will stop processing. But I can see that that cancel has no effect.
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);
}
}
I can see the 2 completable futures still running.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
完整future的Javadoc具有您的问题的答案,特别是
MayInterruptIfrunning
CANCE> CANCEL> CANCEL
方法的评论:The javadoc for CompletableFuture has the answer to your question, specifically the comment for the
mayInterruptIfRunning
parameter of thecancel
method: