0

我想提出一個CSP求解,計算這樣一個特定問題的所有組合子解決方案(簡稱放):如何從另一個終止Java進程?

// 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;它們是否好用選擇?)。這意味着我或用戶無法終止該流程,如果時間過長。

我想添加具有隨意取消解決過程選項的功能。

因此,我將宣佈在求解類的新方法,將終止該進程,這將有效地停止解析過程:

public void stopResolutionProcess() { 
    // kill the process, therefore, stop the resolution process 
} 

我不能就這麼叫problem.getSolver().stopResolutionProcess()後的解決過程已經開始,因爲該線程已經運行,直到該進程結束,該方法調用將永遠不會執行。

那麼我怎麼能做到這一點?客戶如何指示託管在雲中的服務終止正在運行的進程?

回答

0

既然您還沒有選擇雲主機,那麼這個問題真的很難回答。一般來說,你需要一個同步對象。喜歡的東西

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上是無關緊要的。選擇一種產品作爲託管服務,如果遇到麻煩,請回復一個更具體的問題。

+0

此解決方案不起作用。 'solve'方法只是調用Choco方法'solver.findSolution()'。這是'findSolution()'方法,可能需要很長時間才能完成。 – dabadaba

+0

正如我所說。這更多的是一個普遍的問題,這個例子實際上只是理論上如何實現這一點的一個起點。檢查標誌的位置並不重要。在AppEngine中,根本不使用線程,您可以使用任務隊列並檢查緩存的數據存儲區值,因此'keepRunning'實際上是查詢數據存儲區的方法。 – konqi

+0

爲了線程安全,請務必將'keepRunning'標誌標記爲'volatile' –

相關問題