0

我正在制作一个 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()在解析过程已经开始之后才调用,因为线程已经在运行并且在该过程结束之前,该方法调用将永远不会被执行。

那么我该怎么做呢?客户端如何向托管在云中的服务发出信号以终止正在运行的进程?

4

2 回答 2

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 上是题外话。选择一个托管产品,如果您遇到问题,请返回一个更具体的问题。

于 2016-04-01T08:59:18.080 回答
0

将长时间运行的进程放在不同的线程中。如有必要,您可以从主线程中停止它。看:

如何通过另一个线程停止一个线程?

于 2016-04-01T09:01:40.833 回答