【问题标题】:How to terminate a Java process from a different one?如何终止另一个 Java 进程?
【发布时间】:2016-04-01 08:50:01
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    How to stop a thread by another thread?

    【讨论】:

      【解决方案2】:

      由于您还没有选择云主机,这个问题真的很难回答。一般来说,您需要一个同步对象。像

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

      【讨论】:

      • 此解决方案不起作用。 solve 方法只是调用 Choco 方法 solver.findSolution()findSolution() 方法可能需要很长时间才能完成。
      • 如我所说。这更像是一个普遍的问题,这个例子实际上只是你如何在理论上实现这一点的一个起点。在哪里检查标志并不重要。在 AppEngine 中,您根本不会使用线程,而是使用任务队列并检查缓存的数据存储区值,因此 keepRunning 实际上是一种查询数据存储区的方法。
      • 为了线程安全,请确保将keepRunning 标志标记为volatile
      • @AdamMichalik 很好,我添加了易失性。不过,App Engine 方法不会使用线程,因此不需要 volatile。
      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2012-06-14
      • 2012-04-24
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多