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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛奎 中级黑马   /  2012-6-23 09:38  /  2284 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

假如有t1,t2两个线程  t1与t2中分别有wait(),notify()函数
如果t1中执行到notify()进行唤醒冻结的t2的操作时      
这个时候,cpu立刻执行t2吗   还是t2被唤醒之后,t1与t2还是并发的抢cpu执行权??

6 个回复

正序浏览
有个实际的例子,电视娱乐节目,每次随机抽取多个幸运观众,抽到了,这些观众上台再进行PK,胜者就可以进入下一环节,赢取奖品。(执行程序)其他观众就等着呗,只有看的份,不行自个睡会~!
抽奖结束下一轮开始了哈!~主持人一声令下,(notifyAll)全精神了~大家都在抢镜头,接着随选取下一个幸运观众......但是不知道会选到谁!~
notify()只会随机唤醒一个等待线程。让被唤醒的线程参与争夺CPU执行权,但是能不能争取到,也是不确定的。
回复 使用道具 举报
这个时候的t1只是具备了执行资格,并不一定就会马上执行;因为cpu这个时候肯定不是只有t1和t2这两个线程在执行吧;cpu可能会执行其它的程序;等它执行到t1的时候会进行一下判断t1是否有执行资格:有那么就开始执行;同样cup也可能执行到t2一判断发现t2没有执行资格;所以t2就不被执行;会去执行其它程序;所以t1,t2仍然在并发的抢夺执行权;只是抢到后有没有资格执行的问题;
回复 使用道具 举报
唤醒只能说明把那个进程叫醒了,就是说被叫醒的进程有执行的权限,但正在运行的进程不一定要释放权,所以被叫醒的进程处于等待状态
回复 使用道具 举报
首先不是t1执行到notify(),而是主线程执行到的。 这时t1会进入临时状态(阻塞),t2线程执行。
t1,t2都具备运行资格,因为notify()的存在,t2拥有执行权。
回复 使用道具 举报
你看多线程的输出结果没?假如你没设置同步的话 是随机 抢执行权的
既然都设置了wait(),notify() 等待 唤醒 机制 那同步 估计也会设置吧 当然不排除没...
同步还一个对象问题 都必须是同一个对象才行
设置了同步 等待 唤醒 机制 可以实现轮流操作 执行权的问题
具体的还要看你怎么写代码
回复 使用道具 举报
t2被唤醒之后并不是立刻执行,也是进入一种临时状态,具备运行资格,没有运行权,同样来和别的线程争夺资源。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马