gpt4 book ai didi

java - 长时间运行的 HTTP 请求和线程同步

转载 作者:行者123 更新时间:2023-12-02 07:31:50 25 4
gpt4 key购买 nike

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

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

  1. 生成初始群体(几乎是随机的)
  2. 启动启发式算法线程,每个线程都将群体作为输入
  3. 经过一定时间后,终止线程并向“ Controller 实体”传达线程发现的新群体
  4. 进行一些逻辑推理,并根据第 2 点启动的线程的结果生成新群体
  5. 如果允许的时间尚未到期,请返回第 2 点并添加新群体。否则退出

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

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

非常感谢任何帮助。

谢谢!

最佳答案

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

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

I tried to launch 10 threads [...] I was expecting the HTTP request to wait for all the threads to terminate [...], but it actually responds straight away.

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

关于java - 长时间运行的 HTTP 请求和线程同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com