当前位置: 首页 > 知识库问答 >
问题:

Java CompletableFuture 不取消底层执行

宋鸿德
2023-03-14

我预计从下面的代码中,由于超时,可转换的未来将停止处理。但我可以看到取消没有任何影响。

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个完全期货仍在运行。

共有1个答案

孔琪
2023-03-14

CompletableFuture的javadoc可以回答您的问题,特别是取消方法的可能中断参数的注释:

此值在此实现中没有效果,因为中断不用于控制处理。

 类似资料:
  • 我知道设计无法通过中断来控制其执行,但我想你们中的一些人可能有这个问题。s是组成异步执行的非常好的方法,但考虑到当未来被取消时您希望底层执行被中断或停止的情况,我们如何做到这一点?或者我们必须接受任何取消或手动完成的都不会影响在那里工作以完成它的线程? 在我看来,这显然是一项无用的工作,需要执行者的时间。我想知道在这种情况下,什么方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 你能告诉我一种从Java执行进程而不管底层操作系统的方法吗?例如。 上面的行在Windows环境中执行Maven,但我如何在任何操作系统中运行上面的命令? 如果我没有在启动时添加,那么我就无法在windows环境中运行,错误显示尽管maven主页设置正确。

  • 本文向大家介绍SpringMVC底层执行流程及原理解析,包括了SpringMVC底层执行流程及原理解析的使用技巧和注意事项,需要的朋友参考一下 一个简单的HelloSpringMVC程序 先在web,xml中注册一个前端控制器(DispatcherServlet) 配置文件(springmvc-servlet.xml) HandlerMapper是处理器映射器-->根据请求的地址去找处理器(如案例

  • 在本书中我们也遇到了不少底层的命令。 我们遇到的第一个底层命令是在 合并请求引用 中的 ls-remote 命令。我们用它来查看服务端的原始引用。 我们在 手动文件再合并、 Rerere 及 索引 章节中使用 ls-files 来查看暂存区的更原始的样子。 我们同样在 分支引用 一节中提到了 rev-parse 命令,它可以接受任意字符串,并将其转成一个对象的 SHA-1 值。 我们在 Git 内

  • Docker 底层的核心技术包括 Linux 上的命名空间(Namespaces)、控制组(Control groups)、Union 文件系统(Union file systems)和容器格式(Container format)。 我们知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。这

  • 1、基本架构 Docker 采用了 C/S架构,包括客户端和服务端。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者 RESTful API 来进行通信。 Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行