Executor执行完毕后如何结束主程序?主线程无法终止问题求助
主线程无法终止?大概率是ExecutorService没关闭!
兄弟,我太懂你这种明明静态变量都拿到正确结果了,但程序还赖着不结束的糟心感!你猜的没错,问题就是出在ExecutorService没终止上——默认的线程池里的线程都是非守护线程,哪怕你的任务看似执行完了,这些线程还会一直等着接新任务,导致JVM没法正常退出。
为啥之前用自定义Runnable没这问题?因为你直接new Thread(new YourRunnable()).start()的话,线程跑完run方法就直接终止了,不会占着资源不放。但线程池是为了复用线程设计的,它的工作线程会一直存活,直到你明确告诉它“我没任务给你了,你可以歇着了”。
给你几个解决步骤,亲测好用:
第一步:任务提交完立刻调用
shutdown()
这个方法会告诉线程池“不要再接受新任务了,等当前所有正在执行和排队的任务都做完就关闭”。第二步:等待任务全部完成(可选但建议)
如果你想让主线程等所有任务都执行完再继续,就用awaitTermination()设置一个超时时间,确保任务都能完成。如果超时还没完成,就强制关闭线程池。
举个实际代码例子,你可以照着改:
// 假设你是这么创建线程池的 ExecutorService executor = Executors.newFixedThreadPool(3); // 提交你的任务们 executor.submit(new YourCustomRunnable()); executor.submit(new YourCustomRunnable()); // 关键操作:先关闭线程池,拒绝新任务 executor.shutdown(); try { // 等待所有任务完成,最多等15秒(时间你自己调) if (!executor.awaitTermination(15, TimeUnit.SECONDS)) { // 超时了还没做完?强制关闭,打断正在执行的任务 executor.shutdownNow(); } } catch (InterruptedException e) { // 主线程被中断了?也强制关闭线程池 executor.shutdownNow(); // 恢复中断状态 Thread.currentThread().interrupt(); }
这样一来,线程池会在所有任务完成后关闭工作线程,JVM就能正常终止,主线程也不会一直卡着啦!
内容的提问来源于stack exchange,提问作者Vladyslav Lopatin
相关产品推荐
相关产品推荐

