2012-10-09 45 views
0

我需要編寫一個Web服務,通​​過使用啓發式算法解決複雜問題。只要POST請求中指定的時間已過(即傳遞timeAllowance = 60將確保啓發式算法在60秒後停止並返回找到的最佳解),算法將運行。長時間運行HTTP請求和線程同步

啓發式算法必須在多個線程上運行才能利用所有服務器核心。在算法執行過程中,這些方法必須相互「溝通」。每個線程將運行啓發式算法,並在一定的時間後,線程將傳達他們找到的解決方案,並且如果允許的時間未到期,則會使用不同的初始羣體運行新的週期。總結:

  1. 生成初始羣體(幾乎隨機地)
  2. 啓動啓發式算法線程,每一個採取人口作爲輸入
  3. 一定量的時間之後,終止該線程和通信,以「控制器實體「線程發現的新羣體
  4. 根據點2處啓動的線程結果進行一些邏輯推理並生成新的羣體
  5. 如果允許的時間未過期,則返回到第2點新的人口。否則退出

我的問題是:你將如何使用Spring MVC構造代碼?

就像一個測試,我試圖在服務方法中啓動10個線程,並從控制器調用該方法(自動裝配服務)。線程所做的一切都是睡60秒。我期待HTTP請求等待所有線程終止(即大約60秒),但實際上它會立即響應。

非常感謝任何幫助。

謝謝!

回答

2

你不想要線程,你想要一個線程池(ExecutorService)。提交一些號碼Callable<HeuristicResult>到您的游泳池並等待退回Future<HeuristicResult>。一旦所有的期貨都完成了,你的觀點是4.並且回到2.(但重用線程池)。

最後關閉池或重用它的所有請求(更具擴展性)。

我試圖啓動10個線程我期待HTTP請求等待所有線程終止[...],但實際上它會立即響應。

啓動一個線程是非阻塞的,從那時起線程異步工作。您可以在創建的線程上調用join()以等待其終止。但是線程池和Future.get()更加現代化和靈活。

+0

正是這樣 - 從聽起來像後臺線程開始並且從未加入的問題 –

0

沒有看到任何代碼,我會猜測這個直接返回的原因是你在後臺線程中啓動任務,而不是服務請求的線程。

如果我正在編寫此服務,我可能不會等待60秒,然後再返回響應。我會在後臺啓動任務(使用服務)並立即返回狀態頁面。在此頁面上,您可以使用ajax來查詢服務器的任務狀態,並使用javascript在瀏覽器中呈現進度條。

因此,您需要一個控制器方法來啓動該進程,另一個允許瀏覽器獲取狀態。既然你只是需要時間,因爲它開始取得進展,我很可能會把開始時間和總的允許時間放在會話中。然後,您需要一個控制器方法來計算已用時間的百分比並將其返回給瀏覽器。