Java中Future.get()方法致程序卡住无法终止,求原因分析
问题分析:Java程序卡住原因
你的代码出现卡住的核心原因是线程池未关闭,具体细节如下:
Executors.newFixedThreadPool(10)创建的线程池,其工作线程默认是非守护线程。当主线程执行完future.get()并打印结果后,主线程会结束,但线程池的10个工作线程仍然处于存活状态(等待新任务),JVM会因为存在活跃的非守护线程而无法退出,导致程序看起来“卡住”。- 你的
Task逻辑本身没有问题,call()方法会正常返回随机整数,future.get()也能正常获取结果,但线程池的资源没有被正确释放。
解决方法
有两种常见的解决方式:
任务执行完成后关闭线程池
在获取结果后调用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(); // 异常时也需关闭线程池 }等待线程池关闭后再结束程序
可以在main方法末尾添加等待逻辑,确保线程池完全关闭后JVM才退出:executorService.shutdown(); try { // 等待60秒,直到线程池所有任务执行完毕 if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { // 超时后强制关闭线程池 executorService.shutdownNow(); } } catch (InterruptedException e) { executorService.shutdownNow(); }
内容的提问来源于stack exchange,提问作者Sankalp
相关产品推荐
相关产品推荐

