You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Future.get()方法致程序卡住无法终止,求原因分析

问题分析:Java程序卡住原因

你的代码出现卡住的核心原因是线程池未关闭,具体细节如下:

  • Executors.newFixedThreadPool(10)创建的线程池,其工作线程默认是非守护线程。当主线程执行完future.get()并打印结果后,主线程会结束,但线程池的10个工作线程仍然处于存活状态(等待新任务),JVM会因为存在活跃的非守护线程而无法退出,导致程序看起来“卡住”。
  • 你的Task逻辑本身没有问题,call()方法会正常返回随机整数,future.get()也能正常获取结果,但线程池的资源没有被正确释放。
解决方法

有两种常见的解决方式:

  1. 任务执行完成后关闭线程池
    在获取结果后调用executorService.shutdown(),它会等待已提交的任务执行完毕后再关闭线程池:

    try {
        Integer result = future.get();
        System.out.println("Result from the task is: " + result);
        executorService.shutdown(); // 关闭线程池
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
        executorService.shutdown(); // 异常时也需关闭线程池
    }
    
  2. 等待线程池关闭后再结束程序
    可以在main方法末尾添加等待逻辑,确保线程池完全关闭后JVM才退出:

    executorService.shutdown();
    try {
        // 等待60秒,直到线程池所有任务执行完毕
        if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
            // 超时后强制关闭线程池
            executorService.shutdownNow();
        }
    } catch (InterruptedException e) {
        executorService.shutdownNow();
    }
    

内容的提问来源于stack exchange,提问作者Sankalp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:10:26