【问题标题】:Start new thread within a Servlet [duplicate]在 Servlet 中启动新线程 [重复]
【发布时间】:2020-01-16 08:47:01
【问题描述】:

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

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

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

会用 new Thread(callWSMethod()).start() 来完成吗?

如果不建议这样做,有什么更好的方法?

【问题讨论】:

    标签: java web-services servlets java-threads


    【解决方案1】:

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

    你可以简单地启动一个线程:

    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();
    

    【讨论】:

      【解决方案2】:

      既然你不需要像UserTransaction这样的JEE资源,我觉得这样做就好了。但是,请务必阅读到最后。

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

      但是,我已经多次直接使用ExecutorService,没有任何问题,只要我不想要任何像前面提到的那样的托管资源。我一直使用ExecutorService,而不是直接使用Thread。唯一的“注意”是在处理结束时必须以某种方式关闭ExecutorService

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

      【讨论】:

      • 我想没有提到 EJB 之类的问题;仅关于普通 servlet...
      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 2015-06-23
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2010-10-21
      • 1970-01-01
      相关资源
      最近更新 更多