mot*_*oty 16 java servlets java-ee-6
servlet 3.0异步功能之间的区别是什么:
doGet(request,response) {
Thread t = new Thread(new Runnable()
void run(){
// heavy processing
response.write(result)
}
}
t.start();
Run Code Online (Sandbox Code Playgroud)
在servlet 3.0中,如果我浪费一个线程来进行繁重的处理 - 我在容器中再赚一个线程,但是我在繁重的处理中浪费它... :(
有人可以帮忙吗?
Ron*_*erg 25
这不行.一旦你的doGet方法结束,响应完成并发送回客户端.您的线程可能仍在运行,但可能不再运行,但它不能再更改响应.
Servlet 3.0中新的异步功能的作用是,它允许您释放请求线程以处理另一个请求.会发生什么是以下情况:
RequestThread: |-- doGet() { startAsync() } // Thread free to do something else
WorkerThread: |-- do heavy processing --|
OtherThread: |-- send response --|
Run Code Online (Sandbox Code Playgroud)
重要的是,一旦RequestThread通过调用启动异步处理startAsync(...),就可以自由地做其他事情了.例如,它可以接受新请求.这提高了吞吐量.
servlet 3.0 异步功能可以保持 http 连接打开,但在无法立即处理请求但正在等待某些事件发生时,或者例如在编写某些 comet/reverse ajax 应用程序时,可以释放任何未使用的线程。在上面的情况下,您完全创建了一个新线程,因此它不会对您产生任何影响,除非您想让请求等待某个事件。
最好的问候, 克沙夫