非阻塞Socket通信.ppt

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

An Introduction to Database System 第7章 非阻塞Socket通信 7.1 阻塞和非阻塞通信 7.2 非阻塞通信中的几个类 7.3 使用JavaN10提高服务端程序的性能 7.4 使用NIO编写高性能的服务器 7.5 非阻塞编程实例 本章小结 第7章 非阻塞Socket通信 前面介绍的网络通信程序是基于阻塞式API的——即当程序执行输入、输出操作后,在这些操作返回之前会一直阻塞该线程,所以服务器必须为每个客户端都提供一条独立线程进行处理,当服务器需要同时处理大量客户端时,这种做法会导致性能下降。使用NIO API则可以让服务器使用一个或有限几个线程来同时处理连接到服务器上的所有客户端。 7.1 阻塞和非阻塞通信 一、线程阻塞 在生活中,最常见的阻塞现象是公路上汽车的堵塞。汽车在公路上快速运行,如果前方交通受阻,就只好停下来等待,等到公路顺畅,才能恢复运行。 线程在运行中也会因为某些原因而阻塞。所有处于阻塞状态的线程的共同特征是:放弃CPU,暂停运行,只有等到导致阻塞的原因消除,才能恢复运行;或者被其他线程中断,该线程会退出阻塞状态,并且抛出InterruptedException。 7.1 阻塞和非阻塞通信 1.线程阻塞的原因 (1)线程执行了阻塞线程的方法 : 线程执行了Thread.sleep(int n)方法,线程放弃CPU,睡眠n毫秒,然后恢复运行。 线程要执行一段同步代码,由于无法获得相关的同步锁,只好进入阻塞状态,等到获得了同步锁,才能恢复运行。 线程执行了一个对象的wait()方法,进入阻塞状态,只有等到其他线程执行了该对象的notify()或notifyAll()方法,才可能将其唤醒。 7.1 阻塞和非阻塞通信 (2)当通过Socket的输入流和输出流来读写数据时,都可能进入阻塞状态。这种可能出现阻塞的输入和输出操作被称为阻塞I/O。 (3)在服务器程序中,线程执行ServerSocket的accept()方法,等待客户的连接,直到接收到了客户连接,才从accept()方法返回。 7.1 阻塞和非阻塞通信 2.服务器程序用多线程处理阻塞通信的局限 下图显示了服务器程序用多线程来同时处理多个客户连接的工作流程。主线程负责接收客户的连接。在线程池中有若干工作线程,它们负责处理具体的客户连接。每当主线程接收到一个客户连接,主线程就会把与这个客户交互的任务交一个空闲的工作线程去完成,主线程继续负责接收下一个客户连接。 7.1 阻塞和非阻塞通信 7.1 阻塞和非阻塞通信 服务器程序用多线程来处理阻塞I/O,尽管能满足同时响应多个客户请求的需求,但是有以下局限: (1)Java虚拟机会为每个线程分配独立的堆栈空间,工作线程数目越多,系统开销就越大,而且增加了Java虚拟机调度线程的负担,增加了线程之间同步的复杂性,提高了线程死锁的可能性。 (2)工作线程的许多时间都浪费在阻塞I/O操作上,Java虚拟机需要频繁地转让CPU的使用权,使进入阻塞状态的线程放弃CPU,再把CPU分配给处于可运行状态的线程。 由此可见,工作线程并不是越多越好。 7.1 阻塞和非阻塞通信 二、非阻塞 非阻塞通信的基本思想 假如同时要做两件事:烧开水和烧粥。烧开水的步骤如下:? 锅里放水,打开煤气炉; 等待水烧开; //阻塞 关闭煤气炉,把开水灌到水壶里; 烧烧粥的步骤如下: 锅里放水和米,打开煤气炉; 等待粥烧开; //阻塞 调整煤气炉,改为小火; 等待粥烧熟; //阻塞 关闭煤气炉; 7.1 阻塞和非阻塞通信 为了同时完成两件事,一种方案是同时请两个人分别做其中的一件事,这相当于采用多线程来同时完成多个任务。还有一种方案是让一个人同时完成两件事,这个人应该善于利用一件事的空闲时间去做另一件事,这个人一刻也不应该闲着: 7.1 阻塞和非阻塞通信 锅里放水,打开煤气炉; //开始烧开水 锅里放水和米,打开煤气炉; //开始烧粥 while(一直等待,直到有水烧开、粥烧开或粥烧熟事件发生){? //阻塞 if(水烧开) 关闭煤气炉,把开水灌到水壶里; if(粥烧开) 调整煤气炉,改为小火; if(粥烧熟) 关闭煤气炉; } 7.1 阻塞和非阻塞通信 这个人不断监控烧水以及烧粥的状态,如果发生了“水烧开”、“粥烧开”或“粥烧熟”事件,就去处理这些事件,处理完一件事后继续监控烧水以及烧粥的状态,直到所有的任务都完成。 以上工作方式也可以运用到服务器程序中,服务器程序只需要一个线程就能同时负责接收客户的连接、接收各个客户发送的数据,以及向各个客户发送响应数据。服务器程序的处理流程如下: 7.1 阻塞和非阻塞通信 while(一直等待,直到有接收连接就绪事件、读就绪事件或写就绪事件发生){ //阻塞 i

文档评论(0)

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

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

1亿VIP精品文档

相关文档