Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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 Jetty中的异步与非异步_Java_Embedded Jetty - Fatal编程技术网

Java Jetty中的异步与非异步

Java Jetty中的异步与非异步,java,embedded-jetty,Java,Embedded Jetty,我有一个简单的jetty服务器,我正在学习不同的方法。我已将此改编: 这应该是一个阻塞servlet。我的理解是,这是单线程的,因此,如果我同时发送2个请求,第二个请求将仅在第一个请求完成后处理 然而,当我实际测试它时,它们同时完成(几乎就像它已经是异步的)。如果是这样,为什么我需要AsyncContext async=request.startAsync()?这有什么区别呢?我认为您混合了两件事:异步和阻塞 servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,

我有一个简单的jetty服务器,我正在学习不同的方法。我已将此改编:

这应该是一个阻塞servlet。我的理解是,这是单线程的,因此,如果我同时发送2个请求,第二个请求将仅在第一个请求完成后处理


然而,当我实际测试它时,它们同时完成(几乎就像它已经是异步的)。如果是这样,为什么我需要
AsyncContext async=request.startAsync()?这有什么区别呢?

我认为您混合了两件事:异步和阻塞

servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,池中的新线程将分配给每个请求

但是,如果您需要为数千个请求提供服务,那么这可能不是非常可扩展的

自Servlet 3.0以来,您可以通过将请求注册到队列或列表(我不知道AsyncContext是如何实现的)并通过“工作线程”处理已注册的请求(可以使用另一个线程池管理)来解耦(尝试使其非阻塞)


但这并不意味着我不能编写最终会阻塞另一个工作线程的阻塞代码。

我认为您混合了两件事:异步和阻塞

servlet不是单线程的。事实上,Jetty将在启动期间初始化线程池,在传统方法中,池中的新线程将分配给每个请求

但是,如果您需要为数千个请求提供服务,那么这可能不是非常可扩展的

自Servlet 3.0以来,您可以通过将请求注册到队列或列表(我不知道AsyncContext是如何实现的)并通过“工作线程”处理已注册的请求(可以使用另一个线程池管理)来解耦(尝试使其非阻塞)


但这并不意味着我不能编写最终阻塞另一个工作线程的阻塞代码。

是的,doGet()是阻塞的,是单线程的。建议:在“睡觉”之前,写一条日志信息。确保打印时间(以分钟/秒/毫秒为单位)和线程ID。我注意到doPost也有同样的行为。doPost需要它吗?我确实同时使用S.O.P消息完成了这两项工作,但它仍然是并行完成的。有多个线程为请求提供服务。尝试同时发送1000个请求,看看会发生什么。是的,doGet()正在阻塞,并且是单线程的。建议:在“睡觉”之前,写一条日志信息。确保打印时间(以分钟/秒/毫秒为单位)和线程ID。我注意到doPost也有同样的行为。doPost需要它吗?我确实同时使用S.O.P消息完成了这两项工作,但它仍然是并行完成的。有多个线程为请求提供服务。尝试同时发送1000个请求,看看会发生什么。
public class BlockingServlet extends HttpServlet {

    protected void doGet(
      HttpServletRequest request, 
      HttpServletResponse response)
      throws ServletException, IOException {
 
        response.setContentType("application/json");
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("{ \"status\": \"ok\"}");
    }
}