java - 退出的主线程会杀死异步任务吗?

标签 java multithreading

我正在运行 java8 应用程序,看起来一旦主线程退出,进程就会退出。

我正在使用 completableFuture 启动异步任务,如下所示

CompletableFuture cf = CompletableFuture.supplyAsync(() -> task.call());

        cf.thenRunAsync(() -> {
            try {
                System.out.println(Thread.currentThread());
                System.out.println((Double)cf.get() * 4.0);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });

我希望异步将作为一个单独的线程运行,因此主线程退出不应导致进程退出,但事实并非如此。

我猜异步作业是作为守护线程运行的吗?但无法确认。

最佳答案

如前所述here :

the method supplyAsyncuse ForkJoinPool.commonPool() threadpool which is shared among all CompletableFutures.

如前所述here

ForkJoinPool uses threads in daemon mode, there is typically no need to explicitly shutdown such a pool upon program exit.

看来确实如此。

为避免这种情况,您需要传递一个明确的执行程序,例如:

ExecutorService pool = Executors.newFixedThreadPool(5);
final CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
                ... }, pool);

关于java - 退出的主线程会杀死异步任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816328/

相关文章:

Java - 以编程方式添加 SQL Azure 防火墙规则

java - 使用 NamedParameterJdbcTemplate 插入 Clob

java - 有没有办法替换 .json 文件内字符串中的括号?

java - 如何堆叠传入数据

java线程从静态内部类访问外部类

javascript - 为什么 JS 的递归斐波那契函数比许多其他语言更快?

java - 同步块(synchronized block)未锁定对象引用

java - 将 null 插入 MS Access 中的日期/时间字段 -

java - 如何禁用 ListView 复选框中使用的启用按钮

java - 我可以将一个 Runnable 用于两个线程,以便一个生成,一个消耗吗?