如何从不同的Java进程终止Java进程?

如何从不同的Java进程终止Java进程?,java,multithreading,google-app-engine,constraint-programming,choco,Java,Multithreading,Google App Engine,Constraint Programming,Choco,我正在制作一个CSP解算器,用于计算特定问题的所有组合解,如下所示(简而言之): 解决过程很可能需要很长时间才能完成,比如超过几分钟。到目前为止,在花了这么长时间之后,我刚刚通过控制台停止了这个过程 但最终,我将把我的应用程序作为一个web应用程序发布在一个允许Java应用程序的主机上(附带问题:我已经看到我可以在中实现它,而且我还被告知AWS;它们是好的选择吗?)。这意味着,如果进程花费的时间太长,我或用户将无法再终止该进程 我想添加一个功能,可以随意取消解析过程 因此,我将在Solver类中

我正在制作一个CSP解算器,用于计算特定问题的所有组合解,如下所示(简而言之):

解决过程很可能需要很长时间才能完成,比如超过几分钟。到目前为止,在花了这么长时间之后,我刚刚通过控制台停止了这个过程

但最终,我将把我的应用程序作为一个web应用程序发布在一个允许Java应用程序的主机上(附带问题:我已经看到我可以在中实现它,而且我还被告知AWS;它们是好的选择吗?)。这意味着,如果进程花费的时间太长,我或用户将无法再终止该进程

我想添加一个功能,可以随意取消解析过程

因此,我将在Solver类中声明一个新方法,该方法将终止该过程,从而有效地停止解析过程:

public void stopResolutionProcess() {
  // kill the process, therefore, stop the resolution process
}
在解析过程已经开始之后,我不能只调用
problem.getSolver().stopResolutionProcess()
,因为线程已经在运行,并且在该过程结束之前,该方法调用将永远不会执行


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

因为您还没有选择云主机,所以这个问题很难回答。一般来说,您需要一个同步对象。差不多

volatile boolean keepRunning = true;
你的方法就行了

public void stopResolutionProcess(){
    keepRunning = false;
}
然后在你的求解中,你必须定期检查这个变量

public void solve(){
   while(keepRunning){
       // doSomething();
       Thread.sleep(500);
   }
}
现在我在这里使用一个变量,但这可能不够。在应用程序引擎中,您的应用程序可以在静态变量不同步的不同实例中运行。您需要一个可供所有解算线程访问的同步对象。应用程序内引擎,它将是也缓存在memcache中的数据存储对象。但是您可以使用Pub/Sub或其他机制来传播任务的完成情况。这些细节与您将选择在其上运行的环境紧密耦合


在Stackoverflow上,请求产品推荐通常是离题的。选择一个托管产品,如果遇到问题,返回一个更具体的问题。

将长时间运行的过程放到另一个线程中。如果需要,可以从主线程停止它。见:


此解决方案不起作用。
solve
方法只是调用Choco方法
solver.findSolution()
。这是
findSolution()
方法,可能需要很长时间才能完成。这是一个更普遍的问题,这个例子实际上只是一个起点,从理论上说明如何实现这一点。你在哪里检查国旗其实并不重要。在AppEngine中,您根本不会使用线程,您将使用任务队列并检查缓存的数据存储值,因此
keepRunning
实际上是一种查询数据存储的方法。为了线程安全,请确保将
keepRunning
标记为
volatile
@AdamMichalik很好,我添加了volatile。应用引擎方法不会使用线程,因此不需要volatile。
public void solve(){
   while(keepRunning){
       // doSomething();
       Thread.sleep(500);
   }
}