使用不同的线程在Web应用程序中进行处理

时间:2012-07-18 17:46:39

标签: java multithreading thread-safety

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

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

  1. 从DB中获取一个表中的数据。表有大量数据,查询需要时间。
  2. 对其他一些webserive A进行Web服务调用并获取其数据。
  3. 向其他某个webserice B发送另一个Web服务调用并获取其数据。
  4. 使用输出1,2,3
  5. 进行一些处理

    1,2和3彼此独立,因此可以并行调用。

    现在的问题是:

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

2 个答案:

答案 0 :(得分:1)

要解决第一个问题,我将完成以下4个步骤:

  1. 是的,如果您使用的数据库驱动程序允许并发访问,则分别可以安全地从不同的线程使用。
  2. Web服务通常设计为同时处理不同的请求,因此这也应该有效,这里的问题是您要使用多少个线程(以及处理一个请求需要多长时间)以及是否网络服务将立即防范太多请求。
  3. 这同样适用。
  4. 是的,但你必须在这里做同步,如:等到所有线程都收到他们的结果。您可以使用java.util.concurrent.CyclicBarrier
  5. 实现此目的

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

    第三个问题最终,这就是它们的用途。这也有助于您构建应用程序。

答案 1 :(得分:1)

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

2)建议为每个请求创建3个线程吗? 只要这些东西不依赖于彼此,并且只要你不依赖于在同一个事务中获取这些东西,那么它似乎应该没问题。当然,您必须处理一个或多个线程不成功的情况。你需要一个单独的监视程序线程来取消线程,如果它们花费的时间太长,或者如果一个线程失败则会回来。

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