OptaPlanner v8.11.1.Final运行后后台线程未终止导致JVM无法退出
问题根因
OptaPlanner v8.11.1.Final版本的求解器内部维护了非守护类型的线程池(包括移动计算线程、异步调度线程等),这类线程不会随着solve()方法执行完成自动销毁,也不会随main线程退出自动终止,最终导致JVM持续挂起。从你提供的活跃线程列表也能看到,前缀为OptaPlanner-的存活线程就是导致问题的根因。
解决方案
方案1(官方推荐):求解完成后显式关闭求解器资源
如果你直接使用Solver实例完成同步求解,必须在solve()调用结束后执行close()方法释放线程资源:Solver<你的规划类> solver = solverFactory.buildSolver(); 你的规划类 result = solver.solve(规划问题实例); // 新增以下行释放所有内部线程资源 solver.close();如果你使用
SolverManager做异步求解,必须在所有求解任务结束后调用SolverManager.close()销毁内部线程池。方案2(测试场景临时适配):强制配置内部线程为守护线程
如果你只是做评估测试不想修改业务代码,可以自定义线程工厂将OptaPlanner创建的线程设置为守护线程,这样main线程退出后JVM会直接终止所有守护线程,不需要额外调用关闭方法。该方案不建议生产环境使用,避免运行中的求解任务被强制中断。
验证方式
执行上述操作后可以通过jstack查看存活线程,没有前缀为OptaPlanner-的非守护线程即表示资源已完全释放。
内容的提问来源于stack exchange,提问作者Justin Phillips
相关产品推荐
相关产品推荐

