黑马程序员技术交流社区

标题: 关于阻塞方法的疑惑 [打印本页]

作者: 顾玲玉    时间: 2013-5-29 13:28
标题: 关于阻塞方法的疑惑
本帖最后由 顾玲玉 于 2013-5-30 07:25 编辑

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

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

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

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

加油吧




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