2012-10-09 46 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在浏览器中呈现进度条。

因此,您需要一个控制器方法来启动该进程,另一个允许浏览器获取状态。既然你只是需要时间,因为它开始取得进展,我很可能会把开始时间和总的允许时间放在会话中。然后,您需要一个控制器方法来计算已用时间的百分比并将其返回给浏览器。