java nio 入门教程详解(4)

java nio 入门教程详解(4)

ID:6074931

大小:199.97 KB

页数:28页

时间:2018-01-02

java nio 入门教程详解(4)_第1页
java nio 入门教程详解(4)_第2页
java nio 入门教程详解(4)_第3页
java nio 入门教程详解(4)_第4页
java nio 入门教程详解(4)_第5页
资源描述:

《java nio 入门教程详解(4)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Javanio入门教程详解(三十)Java2013年8月21日暂无评论-第四章选择器在本章中,我们将探索选择器(selectors)。选择器提供选择执行已经就绪的任务的能力,这使得多元I/O成为可能。就像在第一章中描述的那样,就绪选择和多元执行使得单线程能够有效率地同时管理多个I/O通道(channels)。C/C++代码的工具箱中,许多年前就已经有select()和poll()这两个POSIX(可移植性操作系统接口)系统调用可供使用了。许过操作系统也提供相似的功能,但对Java程序员来说,就绪选择功能直到JDK1.4才成为可行的方案。

2、对于主要的工作经验都是基于Java环境的开发的程序员来说,之前可能还没有碰到过这种I/O模型。为了更好地说明就绪选择,让我们回到第三章的带传送通道的银行的例子里。想象一下,一个有三个传送通道的银行。在传统的(非选择器)的场景里,想象一下每个银行的传送通道都有一个气动导管,传送到银行里它对应的出纳员的窗口,并且每一个窗口与其他窗口是用墙壁分隔开的。这意味着每个导管(通道)需要一个专门的出纳员(工作线程)。这种方式不易于扩展,而且也是十分浪费的。对于每个新增加的导管(通道),都需要一个新的出纳员,以及其他相关的经费,如表格、椅子、纸张的夹子

3、(内存、CPU周期、上下文切换)等等。并且当事情变慢下来时,这些资源(以及相关的花费)大多数时候是闲置的。现在想象一下另一个不同的场景,每一个气动导管(通道)都只与一个出纳员的窗口连接。这个窗口有三个槽可以放置运输过来的物品(数据缓冲区),每个槽都有一个指示器(选择键,selectionkey),当运输的物品进入时会亮起。同时想象一下出纳员(工作线程)有一个花尽量多的时间阅读《自己动手编写个人档案》一书的癖好。在每一段的最后,出纳员看一眼指示灯(调用select()函数),来决定人一个通道是否已经就绪(就绪选择)。在传送带闲置时,出纳员

4、(工作线程)可以做其他事情,但需要注意的时候又可以进行及时的处理。虽然这种分析并不精确,但它描述了快速检查大量资源中的任意一个是否需要关注,而在某些东西没有准备好时又不必被迫等待的通用模式。这种检查并继续的能力是可扩展性的关键,它使得仅仅使用单一的线程就可以通过就绪选择来监控大量的通道。选择器及相关的类就提供了这种API,使得我们可以在通道上进行就绪选择。4.1选择器基础掌握本章中讨论的主题,在某种程度上,比直接理解缓冲区和通道类更困难一些。这会复杂一些,因为涉及了三个主要的类,它们都会同时参与到整个过程中。如果您发现自己有些困惑,记录

5、下来并先看其他内容。一旦您了解了各个部分是如何相互适应的,以及每个部分扮演的角色,您就会理解这些内容了。我们会先从总体开始,然后分解为细节。您需要将之前创建的一个或多个可选择的通道注册到选择器对象中。一个表示通道和选择器的键将会被返回。选择键会记住您关心的通道。它们也会追踪对应的通道是否已经就绪。当您调用一个选择器对象的select()方法时,相关的键建会被更新,用来检查所有被注册到该选择器的通道。您可以获取一个键的集合,从而找到当时已经就绪的通道。通过遍历这些键,您可以选择出每个从上次您调用select()开始直到现在,已经就绪的通道

6、。这是在3000英尺高的地方看到的情景。现在,让我们看看在地面上(甚至地下)到底发生了什么。现在,您可能已经想要跳到例4-1,并快速地浏览一下代码了。通过在这里和那段代码之间的内容,您将学到这些新类是如何工作的。在掌握了前面的段落里的高层次的信息之后,您需要了解选择器模型是如何在实践中被使用的。从最基础的层面来看,选择器提供了询问通道是否已经准备好执行每个I/0操作的能力。例如,我们需要了解一个SocketChannel对象是否还有更多的字节需要读取,或者我们需要知道ServerSocketChannel是否有需要准备接受的连接。在与S

7、electableChannel联合使用时,选择器提供了这种服务,但这里面有更多的事情需要去了解。就绪选择的真正价值在于潜在的大量的通道可以同时进行就绪状态的检查。调用者可以轻松地决定多个通道中的哪一个准备好要运行。有两种方式可以选择:被激发的线程可以处于休眠状态,直到一个或者多个注册到选择器的通道就绪,或者它也可以周期性地轮询选择器,看看从上次检查之后,是否有通道处于就绪状态。如果您考虑一下需要管理大量并发的连接的网络服务器(webserver)的实现,就可以很容易地想到如何善加利用这些能力。乍一看,好像只要非阻塞模式就可以模拟就绪检

8、查功能,但实际上还不够。非阻塞模式同时还会执行您请求的任务,或指出它无法执行这项任务。这与检查它是否能够执行某种类型的操作是不同的。举个例子,如果您试图执行非阻塞操作,并且也执行成功了,您将不仅仅发现rea

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。