在 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();
我有一个调用 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();