我正在制作一个CSP求解器来计算像这样的特定问题的所有组合解决方案(简要说明):
// Say we are in a Solver class
public void solve() {
// find solution...
}
// This would be in a Problem class
problem.getSolver().solve();
解决过程很有可能需要很长时间才能完成,比如几分钟。到目前为止,当它花了这么长时间我刚刚通过控制台停止了这个过程。
但最终我要将我的应用程序作为Web应用程序发布到允许Java应用程序的主机中(侧面问题:我已经看到我可以在Google Cloud中执行此操作并且我也被告知了AWS;他们是不错的选择吗?)这意味着我或用户如果花费太长时间就不能再终止该过程。
我想添加一个功能,即可以随意取消解析过程。
所以我会在Solver类中声明一个终止进程的新方法,这将有效地停止解析过程:
public void stopResolutionProcess() {
// kill the process, therefore, stop the resolution process
}
我不能在解析过程开始后调用problem.getSolver().stopResolutionProcess()
,因为线程已在运行,并且在该过程结束之前,该方法调用将永远不会被执行。
那我怎么能这样做?客户如何发信号通知云中托管的服务以终止正在运行的流程?
答案 0 :(得分:0)
由于您还没有选择云端主机,但这个问题真的难以回答。一般来说,您需要一个同步对象。像
这样的东西volatile boolean keepRunning = true;
你的方法会做
public void stopResolutionProcess(){
keepRunning = false;
}
然后在你的解决中你必须定期检查那个变量
public void solve(){
while(keepRunning){
// doSomething();
Thread.sleep(500);
}
}
现在我在这里使用一个变量,但这可能还不够。在App Engine中,您的应用程序可以在不同步静态变量的不同实例中运行。您需要一个可供所有求解线程访问的同步对象。在App Engine中,它将是一个也在内存缓存中缓存的数据存储对象。但您可以使用Pub / Sub或其他机制来传播任务的完成。具体细节与您选择在其上运行的环境紧密相关。
产品推荐请求通常是Stackoverflow上的偏离主题。选择一个托管产品,如果遇到麻烦,请回答一个更具体的问题。
答案 1 :(得分:0)
将长时间运行的进程放在不同的线程中。如有必要,您可以从主线程中停止它。参见: