servlet 3.0异步功能与
之间的区别是什么?old servlet impl
doGet(request,response) {
Thread t = new Thread(new Runnable()
void run(){
// heavy processing
response.write(result)
}
}
t.start();
在servlet 3.0中如果我浪费一个线程来进行繁重的处理 - 我在容器中又多了一个线程,但是我把它浪费在繁重的处理中...... :(
有人可以帮忙吗?
答案 0 :(得分:23)
这不起作用。一旦您的doGet
方法结束,响应就会完成并发送回客户端。您的线程可能正在运行,也可能尚未运行,但它不能再更改响应。
Servlet 3.0中新的异步功能的作用是,它允许您释放请求线程以处理另一个请求。会发生以下情况:
RequestThread: |-- doGet() { startAsync() } // Thread free to do something else
WorkerThread: |-- do heavy processing --|
OtherThread: |-- send response --|
重要的是,一旦RequestThread
通过调用startAsync(...)
启动异步处理,就可以自由地执行其他操作。例如,它可以接受新请求。这提高了吞吐量。
答案 1 :(得分:2)
servlet 3.0异步功能提供了保持http连接打开,但是当请求无法立即提供但等待某些事件发生时,或者例如当您编写一些comet / reverse ajax应用程序时,释放任何未使用的线程。 ,在上面的例子中,你是完全创建一个新线程,所以它不会对你有任何影响,除非你想让请求等待某个事件。
最诚挚的问候, 凯沙夫
答案 2 :(得分:2)
有几个API支持COMET(长期存在的HTTP请求,其中没有线程/请求问题)编程。因此,没有严格的需要使用servlet 3 API来避免线程/请求。一个是在{Glassfish 2.11(Grizzly)中运行的example引擎。第二个解决方案是Jetty Continuation。第三个是Servlet 3 API.。
基本概念是请求创建一些容器管理的异步处理程序,其中请求可以订阅由对象标识的事件(例如clientid字符串)。然后,异步处理线程可以向处理程序说明事件发生,并且请求获得一个线程继续。这完全取决于您可以使用的API选择的应用程序服务器。你选择哪个?
答案 3 :(得分:2)
在servlet容器中创建自己的线程会遇到麻烦。 (可能存在必须执行此操作的情况,但如果您有一些管理线程的框架,那么您应该使用它。)