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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾玲玉 中级黑马   /  2013-5-29 13:28  /  1540 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾玲玉 于 2013-5-30 07:25 编辑

DatagramSocket实例的接受数据的方法  receive(DatagramPacket p)  是一个阻塞的方法,还有IO里读取字节的 int read()方法也是阻塞方法,这个阻塞方法是怎么实现阻塞的?

评分

参与人数 1黑马币 +8 收起 理由
曹睿翔 + 8 神马都是浮云

查看全部评分

6 个回复

倒序浏览
线程的三种状态:运行即获得执行权,冻结即失去了执行权,消亡即不存在了。一般线程创建并开始执行时,并不会立即就获得执行权,而是处在一个
临时状态即阻塞状态,这个状态下线程具备运行的资格,但并没有获取CPU的执行权。这里的阻塞个人理解,当线程获取CPU的执行权时,会有一个判断,看此
线程有没有要处理的数据,如果有的话,CPU就分配执行权,没有的话,CPU就不给线程分配执行权,让线程继续处于此临时状态。
打个比方:你去食堂买饭。当然一般情况下,每个窗口都有人,排队的状态就是一个临时的状态。当然你要是幸运,遇到今天有的窗口没人,你就可以直接买到饭了,即直接
获取执行权。这里的阻塞就是轮到你买饭了,你刷饭卡,发现没钱了,打饭的大妈,就不给你打饭,等你充钱了才可以即获取数据了才可以获取执行权,要不然你就只能是一个有打饭资格却打不到饭的人,这时你就只好去充钱然后再去打饭
再让大妈给你打饭。

点评

鉴于你的问题就是文字性描述,这次加金币  发表于 2013-5-29 16:04

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 比喻很好

查看全部评分

回复 使用道具 举报
yp324 发表于 2013-5-29 13:52
线程的三种状态:运行即获得执行权,冻结即失去了执行权,消亡即不存在了。一般线程创建并开始执行时,并不 ...

我明白什么是阻塞状态,我不明白这个方法它怎么就阻塞了呢?
回复 使用道具 举报
拿read()方法举列:
当程序执行到System.in时,等待键盘录入;read()之所以阻塞就是键盘录入在阻塞,打开键盘录入时缓冲区中时没有数据的,读取方法读取不到数据,读取线程就wait()的,但是System.in底层方法上有监听器,当你输入数据按下enter键时,监听器捕捉到信号,唤醒读取线程从缓冲区中读取到了数据;

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 解释的很好

查看全部评分

回复 使用道具 举报
感谢版主,我也可以发技术博客了。其实还是想多逛论坛的,但是好多还不会,每天都花大量的时间在看视频,反复看同样的视频是很正常的事,表示鸭梨还是很大的。希望大家都可以一起进云四
回复 使用道具 举报
如果问题已经解决,请把帖子的类型改为已经解决,如果不会解决请看我的个性签名。
回复 使用道具 举报
yp324 发表于 2013-5-29 16:08
感谢版主,我也可以发技术博客了。其实还是想多逛论坛的,但是好多还不会,每天都花大量的时间在看视频,反 ...

加油吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马