【问题标题】:using different threads to do processing in web application在 Web 应用程序中使用不同的线程进行处理
【发布时间】:2012-07-21 06:57:42
【问题描述】:

我有一个 Java EE Web 应用程序。现在,当一个特定的请求到来时(比如 /xyz url 模式),我想做如下复杂的处理

以下 3 个步骤中的每一个都非常复杂且需要时间。

  1. 从 DB 中获取一张表的数据。表数据量大,查询耗时。
  2. 对其他网络服务 A 进行网络服务调用并获取其数据。
  3. 对其他 Web 服务 B 进行另一个 Web 服务调用并获取其数据。
  4. 使用 1、2、3 的输出做一些处理

1、2、3相互独立,可以并行调用。

现在的问题是:

  1. 我可以在三个单独的线程中执行操作 1、2 和 3 吗?
  2. 是否建议为每个请求创建 3 个线程?
  3. 我应该使用线程池吗?

【问题讨论】:

  • 简单的方法是使用Ajax
  • @Gray 现在 100 % :)。我之前忘记接受它
  • @nidhin :这与 ajax 无关。我需要为某些输入 i 提供一些输出 o。要计算 o,我需要执行上述步骤 1、2、3、4。跨度>

标签: java multithreading thread-safety


【解决方案1】:

要解决您的第一个问题,我会执行 4 个步骤:

  1. 是的,如果您使用的数据库驱动程序分别允许并发访问,则可以安全地从不同线程使用。
  2. Web 服务通常设计为同时处理不同的请求,因此这应该也可以,这里的问题是您要使用多少线程(以及处理一个请求需要多长时间)以及是否Web 服务会同时保护自己免受过多请求。
  3. 这里也一样。
  4. 是的,但是您必须在此处进行同步,例如:等到所有线程都收到它们的结果。您可以通过java.util.concurrent.CyclicBarrier 实现这一点

第二个问题 这取决于您的数据,尤其是网络服务的响应速度,您应该尝试一下。

第三个问题毫无疑问,这就是他们的目的。这也将帮助您构建应用程序。

【讨论】:

    【解决方案2】:

    1) 我可以在三个单独的线程中执行操作 1 ,2 和 3 吗? 是的,你可以。

    2) 是否建议为每个请求创建 3 个线程? 只要这些东西不相互依赖,并且只要你不依赖于在同一个事务中获得它们,那么看起来应该没问题。当然,您将不得不处理一个或多个线程不成功的情况。如果线程耗时过长或返回失败,您将需要一个单独的看门狗线程来取消线程。

    3) 我应该使用线程池吗? 不管你做什么,每当你使用线程时,你都应该使用一个池。这样,如果出现线程未完成或进入某种不良状态或以其他方式变得不可用的问题,您可以保护您的应用程序不会耗尽线程。

    【讨论】:

      猜你喜欢
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多