如何从另一个进程终止Java进程?

时间:2016-04-01 08:50:01

标签: java multithreading google-app-engine constraint-programming choco

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

那我怎么能这样做?客户如何发信号通知云中托管的服务以终止正在运行的流程?

2 个答案:

答案 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)

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

How to stop a thread by another thread?