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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:54:04