孙卫琴网络编程PPT4.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
孙卫琴网络编程PPT4

Java网络编程精解 作者:孙卫琴 参考书籍:Java网络编程精解 技术支持网址: 第4章 非阻塞通信 4.1 线程阻塞的概念 4.2 java.nio包中的主要类 4.3 服务器编程范例 4.3.1 创建阻塞的EchoServer 4.3.2 创建非阻塞的EchoServer 4.3.3 在EchoServer中混合用阻塞模式与非阻塞模式 4.4 客户端编程范例 4.4.1 创建阻塞的EchoClient 4.4.2 创建非阻塞的EchoClient 4.4.3 创建非阻塞的PingClient 4.1 线程阻塞的概念 在生活中,最常见的阻塞现象是公路上汽车的堵塞。汽车在公路上快速运行,如果前方交通受阻,就只好停下来等待,等到公路顺畅,才能恢复运行。 线程在运行中也会因为某些原因而阻塞。所有处于阻塞状态的线程的共同特征是: 放弃CPU,暂停运行,只有等到导致阻塞的原因消除,才能恢复运行;或者被其他线程中断,该线程会退出阻塞状态,并且抛出InterruptedException。 4.1.1 线程阻塞的原因 导致线程阻塞的原因主要有以下方面: 线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。 线程要执行一段同步代码,由于无法获得相关的同步锁,只好进入阻塞状态,等到获得了同步锁,才能恢复运行。 线程执行了一个对象的wait()方法,进入阻塞状态,只有等到其他线程执行了该对象的notify()或notifyAll()方法,才可能将其唤醒。 线程执行I/O操作或进行远程通信时,会因为等待相关的资源而进入阻塞状态。 4.1.1 线程阻塞的原因 进行远程通信时,在客户程序中,线程在以下情况可能进入阻塞状态: 请求与服务器建立连接时,会进入阻塞状态,直到连接成功。 线程从Socket的输入流读入数据时,如果没有足够的数据,就会进入阻塞状态,直到读到了足够的数据,或者到达输入流的末尾,或者出现了异常,才从输入流的read()方法返回或异常中断。 线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。 当调用Socket的setSoLinger()方法设置了关闭Socket的延迟时间,那么当线程执行Socket的close()方法时,会进入阻塞状态,直到底层Socket发送完所有剩余数据,或者超过了setSoLinger()方法设置的延迟时间,才从close()方法返回。 4.1.1 线程阻塞的原因 在服务器程序中,线程在以下情况可能会进入阻塞状态: 线程执行ServerSocket的accept()方法,等待客户的连接,直到接收到了客户连接,才从accept()方法返回。 线程从Socket的输入流读入数据时, 如果输入流没有足够的数据,就会进入阻塞状态。 线程向Socket的输出流写一批数据时,可能会进入阻塞状态,等到输出了所有的数据,或者出现异常,才从输出流的write()方法返回或异常中断。 4.1.1 线程阻塞的原因 由此可见,无论是在服务器程序还是客户程序中,当通过Socket的输入流和输出流来读写数据时,都可能进入阻塞状态。这种可能出现阻塞的输入和输出操作被称为阻塞I/O。与此对照,如果执行输入和输出操作时,不会发生阻塞,则称为非阻塞I/O。 4.1.2 服务器程序用多线程处理阻塞通信的局限 (1)Java虚拟机会为每个线程分配独立的堆栈空间,工作线程数目越多,系统开销就越大,而且增加了Java虚拟机调度线程的负担,增加了线程之间同步的复杂性,提高了线程死锁的可能性。 (2)工作线程的许多时间都浪费在阻塞I/O操作上,Java虚拟机需要频繁的转让CPU的使用权,使进入阻塞状态的线程放弃CPU,再把CPU分配给处于可运行状态的线程。 4.1.2 服务器程序用多线程处理阻塞通信的局限 工作线程并不是越多越好。如图4-2所示,保持适量的工作线程,会提高服务器的并发性能,但是当工作线程的数目到达某个极限,超出了系统的负荷时,反而会降低并发性能,使得多数客户无法快速得到服务器的响应。 4.1.3 非阻塞通信的基本思想 服务器程序只需要一个线程就能同时负责接收客户的连接、接收各个客户发送的数据,以及向各个客户发送响应数据。服务器程序的处理流程如下: while(一直等待,直到有接收连接就绪事件、读就绪事件或写就绪事件发生){ //阻塞 if(有客户连接) 接收客户的连接; //非阻塞 if(某个Socket的输入流中有可读数据) 从输入流中读数据; //非阻塞 if(某个Socket的输出流可以写数据) 向输出流写数据; /

文档评论(0)

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

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

1亿VIP精品文档

相关文档