A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周朋飞 中级黑马   /  2012-6-28 14:16  /  1411 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张老师在讲交通灯或者银行调度的时候都提到了一个新的IO类库,我查看了文档,的确 网上说NIO库的引入使得java涉及IO的操作有了阻塞和非阻塞两种方式,这两种方式都有什么区别,各自的优势在哪呢,有谁能够举个简单的例子 或者详细说一下

2 个回复

正序浏览
阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。

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

点评

引用他人文章,请注明,此种回帖将不会被视为违规操作  发表于 2012-6-28 16:57
警告第一次,你的回复涉及引用其他站点他人文章部分内容,我将检查你的所有回帖,如情节严重将做扣分处理  发表于 2012-6-28 16:56
回复 使用道具 举报
阻塞式IO,每个连接必须要开一个线程来处理,并且没处理完线程不能退出。
非阻塞式IO,由于基于反应器模式,用于事件多路分离和分派的体系结构模式,所以可以利用线程池来处理。事件来了就处理,处理完了就把线程归还。而传统阻塞方式不能使用线程池来处理,假设当前有10000个连接,非阻塞方式可能用1000个线程的线程池就搞定了,而传统阻塞方式就需要开10000个来处理。如果连接数较多将会出现资源不足的情况。非阻塞的核心优势就在这里。

点评

鉴于你的回答涉及到其他站点文章部分内容,我将检查你的所有回帖是否还有违规。  发表于 2012-6-28 16:55
警告第一次,如果这个知识点你不懂,可以先学会在根据自己的理解来回答。如果引用他人文章,请注明  发表于 2012-6-28 16:53
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马