lecture4非阻塞通信2015.ppt

  1. 1、本文档共91页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 非阻塞通信 主要内容 线程阻塞的概念 Java.nio包中类的介绍: ServerSocketChannel SocketChannel Selector/SelectionKey/ByteBuffer等 阻塞模式与非阻塞模式的实现 4.1线程阻塞的概念 处于阻塞状态的线程共同特征: 1、放弃CPU,暂停运行,只有等待导致阻塞的原因消除,才能恢复运行; 2、或者被其他线程中断,该线程会退出阻塞状态,并且抛出InterruptedException 4.1线程阻塞的原因 1、线程执行Thread.sleep(int n); 2、线程要执行一段同步代码 3、线程执行了一个对象的wait()方法,只有其他线程执行了该对象的notify()或notifyAll()方法,才能将其唤醒 4、线程执行I/O操作,如ReadLine之类的方法。 客户程序线程进入阻塞状态的情况 1、客户程序与服务器建立连接时,会进入阻塞状态,直到连接成功,线程才返回 2、线程从Socket的输入流读入数据时,如果没有足够的数据,就进入阻塞状态,直到读到足够数据,或到达输入流末尾,或者异常,才会返回。输入流的不同读方法: int read():输入一个字节就足够 int read(byte[] buff):输入流字节数和数组长度相同 String readLine():输入流中有一行字符串就足够,需要BufferReader的此方法。 客户程序线程进入阻塞状态的情况 3、线程从Socket的输出流写数据时,可能进入阻塞状态,等待输出了所有数据或者出现异常,才从输出流的write()方法返回或者异常中断 4、调用Socket的close()方法时如果设置了关闭Socket的延迟时间,会进入阻塞,直到底层 Socket发完所有数据,或者超过setSoLinger()方法设置的延迟时间,才从close()方法返回。 服务器程线程进入阻塞状态的情况 1、线程执行ServerSocket的accept()方法 2、线程从Socket的输入流读入数据,同客户端 3、线程从Socket的输出流写出数据,同客户端 综上,通过Socket的输入输出流来读写数据时,都可能进入阻塞状态。这种可能出现阻塞的输入输出操作称为阻塞I/O 与此对照,如果这种输入输出流读写操作不发生阻塞,则称为非阻塞I/O 4.1.2服务器多线程处理阻塞通信局限 4.1.2服务器多线程处理阻塞通信局限 局限: 每个线程分配独立的堆栈空间,线程调度、同步、死锁可能 很多时间浪费在阻塞IO操作上,线程切换频繁 非阻塞通信的基本思想 一心多用 轮询—while 处理流程 While(一直等待,直到有接收连接就绪事件、读就绪事件、写就绪事件发生){//阻塞 If(有客户连接) 接收客户连接;//非阻塞 If(Socket输入流有可读数据) 从输入流中读数据; //非阻塞 If(Socket输出流可写数据) 向输出流中写数据; //非阻塞 Java.nio包中的主要类 以下支持阻塞和非阻塞通信的类 ServerSocketChannel:ServerSocket的替代类,支持阻塞与非阻塞通信 SocketChannel:Socket的替代类,同上 Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪、写就绪事件。 Java.nio包中的主要类 SelectionKey:代表ServerSocketChannel 和SocketChannel向Selector注册事件的句柄,当一个SelectionKey对象位于Selector对象的selected-keys集合中时,就表示与这个SelectionKey对象相关的事件发生了。 Java.nio包中的主要类 如何注册事件的呢? ServerSocketChannel向Selector注册接收连接就绪事件的代码如下:注册事件过程 SelectionKey key = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); Java.nio包中的主要类 ServerSocketChannel和SocketChannel都是SelectableChannel的子类, SelectableChannel及其子类都能委托Selector来监控它们可能发生的一些事件,这个委托过程也称为注册事件过程 SelectionKey类静态常量—事件类型 SelectionKey的一些静态常量表示事件类型 ServerSocketChannel只可能发生一种事件: SelectionKey.OP_ACCEP

文档评论(0)

shaoye348 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档