0

我需要编写一个通过使用启发式算法来解决复杂问题的 Web 服务。只要 POST 请求中指定的时间已经过去,算法就会运行(即传递 timeAllowance=60 将确保启发式算法在 60 秒后停止并返回找到的最佳解决方案)。

启发式算法必须在多个线程上运行才能利用所有服务器内核。在算法执行过程中,这些方法必须相互“通信”。每个线程将运行启发式算法,并在一定时间后,线程将传达他们找到的解决方案,如果允许的时间尚未到期,则以不同的初始人口运行新的循环。总结:

  1. 生成初始种群(几乎是随机的)
  2. 启动启发式算法线程,每个线程都将人口作为输入
  3. 一定时间后,终止线程并将线程找到的新种群与“控制器实体”通信
  4. 做一些逻辑推理并根据第 2 点启动的线程的结果生成新的种群
  5. 如果允许的时间尚未到期,请返回第 2 点,使用新的种群。否则退出

我的问题是:您将如何使用 Spring MVC 构建代码?

作为测试,我尝试在服务方法中启动 10 个线程并从控制器调用该方法(自动装配服务)。线程所做的一切都是休眠 60 秒。我期待 HTTP 请求等待所有线程终止(即大约 60 秒),但它实际上立即响应。

非常感谢任何帮助。

谢谢!

4

2 回答 2

2

你不想要线程,你想要一个线程池(ExecutorService)。将一些数量提交Callable<HeuristicResult>到您的池中并等待返回Future<HeuristicResult>。完成所有未来后,执行第 4 点并返回 2。(但重用线程池)。

最后关闭池或将其重用于所有请求(更具可扩展性)。

我尝试启动 10 个线程 [...] 我期待 HTTP 请求等待所有线程终止 [...],但它实际上立即响应。

启动线程是非阻塞的,从那一刻起线程异步工作。您可以调用join()创建的线程以等待其终止。但是线程池Future.get()更加现代和灵活。

于 2012-10-09T17:09:30.043 回答
0

在没有看到任何代码的情况下,我猜想直接返回的原因是您在后台线程中启动了任务,而不是为请求提供服务的线程。

如果我正在编写此服务,我可能不会等待 60 秒再返回响应。我会在后台启动任务(使用服务)并立即返回状态页面。在此页面上,您可以使用 ajax 轮询服务器以获取任务的状态,并使用 javascript 在浏览器中呈现进度条。

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

于 2012-10-09T17:08:46.237 回答