当前位置: 首页 > 知识库问答 >
问题:

Servlet3.0中的Java-Async与Servlet3.1中的NIO

伯建安
2023-03-14

有人能更多地说明这个话题吗?具体地说,我正在寻找一个示例,说明服务器的servlet3.0实现如何可以是异步的,但在线程上阻塞?我想,如果我理解了这一点,就更容易理解Servlet3.1中的非阻塞I/O试图解决的确切问题。

共有1个答案

韦睿
2023-03-14

我会试着总结我所学到的东西。为了理解Servlet3.0和Servlet3.1所解决的问题,让我们这样看:

在Servlet3.0:
之前,同步处理请求的问题是,它导致线程(做繁重的工作)在响应出去之前长时间运行。如果这种情况发生在规模上,servlet容器最终会用完线程--长时间运行的线程会导致线程短缺。

在Servlet3.0之前,对于这些长时间运行的线程,存在特定于容器的解决方案,在这些解决方案中,我们可以生成一个单独的辅助线程来完成繁重的任务,然后将响应返回给客户机。启动辅助线程后,servlet线程返回servlet池。Tomcat的Comet、WebLogic的FutureResponseServlet和WebSphere的异步请求分派器是实现异步处理的一些示例。
(有关更多信息,请参见链接1)

  • 如果进入服务器(I/O)的数据阻塞或流比服务器可以读取的慢,那么试图读取该数据的服务器线程必须等待该数据。
  • 另一方面,如果从服务器写入ServletOutputStream的响应数据很慢,则客户端线程必须等待。在这两种情况下,服务器线程执行传统的I/O(请求/响应)块。

换句话说,在Servlet3.0中,只有请求处理部分变成了异步的,而不是服务请求和响应的I/O。如果有足够的线程阻塞,则会导致线程不足并影响性能

对于Servlet3.1NIO,这个问题可以通过ReadListenerWriteListener接口解决。它们注册在ServletInputStreamServletOutputStream中。监听器具有回调方法,当内容可供读取或写入时,无需servlet容器阻塞I/O线程。因此,这些I/O线程被释放出来,现在可以为其他请求提供服务,从而提高性能。(有关更多信息,请参见链接2。)

    null
 类似资料:
  • 我有一个带有复选框的列表视图。对于每个复选框(大约有3个),它都有一个特定的AsyncTask。 我从来不知道用户选择了什么复选框,所以我不能把AlertDialog放在异步任务的末尾,因为我从来不知道用户是只选择了一个复选框,还是两个或三个。 因为AsyncTask是分步执行的(只有当第一个Async任务完成时,第二个Async任务才开始),所以我考虑在所有任务的末尾添加一个带有AlertDia

  • 问题内容: 基本上,我希望每10毫秒调用一次函数。 如何在Java中实现? 问题答案: 您可能想看看Timer。

  • 异步任务(Async/Await)在.NET 4.5中是如何工作的? 一些示例代码: 第二个语句是立即执行还是在第一个返回之后执行?

  • 问题内容: 假设我要打印5行。哪种方法最好(提高性能和可读性)。 要么 是偏好问题还是一个优于另一个问题。使用第二种方法似乎可以节省很多时间。 问题答案: 有一个 功能性 两者之间的区别。第一个版本使用平台的首选行分隔符输出换行符。第二个版本输出换行符,这在Windows或Mac OS上可能是不合适的。 这比任何实际或想象的性能优势都重要。 关于性能,以及为什么每个人似乎都说“已经足够”了。 两种

  • 问题内容: Java中的PrintWriter和FileWriter是否相同,并且无论使用哪个?到目前为止,我都使用了这两种方法,因为它们的结果相同。在某些特殊情况下,优先选择一个而不是另一个吗? 问题答案: 根据coderanch.com的说法,如果我们将答案结合在一起,则会得到: FileWriter是IO的字符表示。这意味着它可以用来写字符。在内部,FileWriter将使用基础操作系统的默

  • 问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要