Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet 3.0异步_Java_Servlets_Java Ee 6 - Fatal编程技术网

Java Servlet 3.0异步

Java Servlet 3.0异步,java,servlets,java-ee-6,Java,Servlets,Java Ee 6,servlet 3.0异步功能与以下功能有什么区别: oold servlet实现: doGet(request,response) { Thread t = new Thread(new Runnable() void run(){ // heavy processing response.write(result) } } t.start(); 在servlet 3.0中,如果我浪费一个线程去做繁重的处理——我在容器中多赚了一个线程,但我

servlet 3.0异步功能与以下功能有什么区别:

oold servlet实现:

doGet(request,response) {
Thread t = new Thread(new Runnable()
     void run(){
        // heavy processing
        response.write(result)
     }
}
t.start();
在servlet 3.0中,如果我浪费一个线程去做繁重的处理——我在容器中多赚了一个线程,但我在繁重的处理中浪费了它…:(


有人能帮忙吗?

servlet 3.0异步功能提供了保持http连接打开的功能,但在请求无法立即得到服务但正在等待某个事件发生时,或者在编写某个comet/reverse ajax应用程序时,可以释放任何未使用的线程。在上述情况下,您正在创建一个新的线程复合体因此,除非您想让请求等待某个事件,否则它不会对您造成任何影响

致以最良好的祝愿,
Keshav

这将不起作用。一旦您的
doGet
方法结束,响应将完成并发送回客户端。您的线程可能正在运行,也可能尚未运行,但它无法再更改响应

Servlet 3.0中新的异步功能的作用是,它允许您释放请求线程以处理另一个请求。发生的情况如下:

RequestThread:  |-- doGet() { startAsync() }  // Thread free to do something else
WorkerThread:                 |-- do heavy processing --|
OtherThread:                                            |-- send response --|

重要的是,一旦
RequestThread
通过调用
startAsync(…)
启动异步处理,它就可以自由地做其他事情。例如,它可以接受新请求。这可以提高吞吐量。

有几个API-s支持(长期存在的HTTP请求,没有线程/请求问题)编程。因此,不需要严格使用servlet 3 API来避免线程/请求。一个是运行在Glassfish 2.11()中的引擎。第二个解决方案是。第三个是


基本概念是,请求创建一些容器管理的异步处理程序,请求可以在其中订阅由对象标识的事件(例如clientid字符串)。然后异步处理线程可以对处理程序说,事件发生了,请求得到一个线程继续。这完全取决于您选择的应用程序服务器,您可以使用哪个API。您可以选择哪个?

在servlet容器中创建您自己的线程是自找麻烦。(在某些情况下,您可能必须这样做,但是如果您有一些框架为您管理线程,那么您应该使用它。)

应该注意,Grizzly和Jetty各自通过自己的解决方案来实现这一点,而Servlet 3.0标准意味着这样的不可移植性(跨不同的应用程序服务器)解决方案将不再是必要的。自然,Grizzly和Jetty都(或将要)了可以想象,实现Servlet 3.0。因此,这不是在三者之间进行选择的问题,而是选择两者中的哪一个,哪一个实现了第三个。如果下面的任何答案都是您想要的,您可以将其标记为这样吗?就我的理解而言,
RequestThread
不会“自由”去做一些事情e在调用
startAsync(…)
之后,只有当
RequestThread
完成了它的工作时,它才是空闲的,例如,如果
startAsync(…)
doGet()
RequestThread
中被调用,则执行
doGet()
后,它将是空闲的。确切地说,处理
doGet()的线程
,将在整个方法堆栈完成后可用(调用方法的方法……调用调用
doGet()的方法)。请注意,RequestThread和OtherThread是容器线程,而WorkerThread是应用程序线程