[英]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.