簡體   English   中英

如何終止另一個Java進程?

[英]How to terminate a Java process from a different one?

我正在制作一個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() ,因為線程已經在運行,並且在該過程結束之前,該方法調用將永遠不會執行。

那我該怎么辦呢? 客戶端如何發出信號通知雲中托管的服務以終止正在運行的進程?

由於您尚未選擇雲主機,因此實際上很難回答這個問題。 一般來說,您需要一個同步對象。 就像是

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上不合時宜。 選擇一種托管產品,如果您遇到麻煩,請返回更具體的問題。

將長時間運行的進程放在另一個線程中。 您可以根據需要從主線程停止它。 看到:

如何通過另一個線程停止一個線程?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM