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