线程从Servlet开始 - 总是坏主意?

时间:2012-05-29 18:51:15

标签: java multithreading tomcat servlets

我有一个执行以下操作的servlet:

  1. 从webservice
  2. 获取一组数据
  3. 从本地数据库获取一组数据。
  4. 合并两组并返回结果。
  5. 实际上很少在servlet代码本身内完成,但是servlet调用了执行上述操作的Java类。

    由于大部分时间都花在等待webservice和数据库上,我正在考虑同时执行这两个:将webserivce调用放在一个线程中,从数据库中获取数据,然后等待web服务完成之前持续。这似乎应该可以正常工作,但我经常听说从servlet启动线程是一个坏主意?我很难看到这种情况会如何导致问题。任何帮助都会很棒(在linux上使用tomcat 6)。谢谢!

3 个答案:

答案 0 :(得分:1)

我没有看到它有任何问题,并且经常看到线程是从servlet本身启动的。用例是在servlet中启动线程的理由。

答案 1 :(得分:0)

每次请求到达服务器时,容器都会分配或创建一个新线程来处理请求,对于每个请求,每次在自己的堆栈中调用service()方法,然后service()方法调用doGet或doPost取决于在Http请求上。 现在完全可以使用在doGet或doPost范围内的线程。

答案 2 :(得分:0)

系统可以支持的线程数量是有限的资源。而且,创建线程是昂贵的操作。因此,现代servlet容器不会为每个请求创建新线程,而是维护线程池。来自池的线程被分配给传入请求。如果所有线程都忙,请求将被放入队列或创建新线程(取决于servlet容器使用的策略)。

因此,创建线程肯定会起作用(从功能角度来看),但如果你有很多请求,你的服务器将开始窒息。您可以使用servlet容器使用的类似策略。 Java已经为这类任务提供了框架。查看Executor的javadoc和相关类。