黑马程序员技术交流社区

标题: 一个NIO的疑问 [打印本页]

作者: 周朋飞    时间: 2012-6-28 14:16
标题: 一个NIO的疑问
张老师在讲交通灯或者银行调度的时候都提到了一个新的IO类库,我查看了文档,的确 网上说NIO库的引入使得java涉及IO的操作有了阻塞和非阻塞两种方式,这两种方式都有什么区别,各自的优势在哪呢,有谁能够举个简单的例子 或者详细说一下
作者: 赵庆礼    时间: 2012-6-28 14:35
阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。

作者: sbeeqnui1987    时间: 2012-6-28 16:42
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

例如,我们在 CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数 recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。
    非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2