在 Servlet 中启动新线程

Start new thread within a Servlet

我有一个调用 Web 服务的 servlet。

servlet 不需要等待 servlet 结束,因为它不需要来自其响应的任何信息。

我可以生成一个新线程来调用网络服务吗?

会不会用new Thread(callWSMethod()).start()?

如果不推荐,有什么更好的方法吗?

既然不需要像UserTransaction这样的JEE资源,我觉得这样也可以。但是,请务必阅读到最后。

在早期版本的 JEE 中,我记得不推荐这样做,因为启动线程不会有托管资源和上下文,如 EJB、连接池、JTA 事务等。但是,我不确定如果在 JEE7 中仍然不推荐。 JEE7 中还有 ManagedExecutorService 可用于此目的。

但是,我直接ExecutorService做了很多次都没有问题,只要我不想要任何像前面提到的那样的托管资源 .我一直使用 ExecutorService 而不是直接使用 Thread。唯一的 "watch-out-for" 是必须在处理结束时以某种方式关闭 ExecutorService

但很多人不同意这种做法。让我们也听听其他人的意见。

看起来 servlet 只对触发(即发即弃)分布在其他地方的 process/thread 感兴趣。在这种情况下,我不会担心事务或托管资源,因为您正在调用一个不与您的应用程序共享任何内容的独立服务。

您可以简单地开始一个话题:

public class MyThread extends Thread {

public void run(){
   // callWSMethod
}

}

一种优雅的方法是使用 Java Lambda

Runnable callWSMethod =
    () -> { // perform call};

Thread thread = new Thread(callWSMethod);
thread.start();

线程池

servlet 可能会收到多个请求,如果您预计请求量很大,您希望限制应用程序创建的线程数。您可以使用 ExecutorService

ExecutorService executorService = Executors.newFixedThreadPool(5);

executorService.execute(new Runnable() {
  public void run() {
    // perform call};
  }
});

别忘了关机

executorService.shutdown();