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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谭荣强 高级黑马   /  2014-4-16 22:39  /  892 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

老毕视频中的,有有点疑问。同步函数的wait方法后面怎么可以有两个线程等待?同步中不是只能一个进一个出吗
线程的状态:冻结(等待,睡眠),放弃了执行资格。
synchonized(){
        Thread.sleep(10);//t1睡眠,别的线程进不来,只能等线程醒来。
}
public synchronized void consume() {                 
                if(!flag){
                        try {
                                wait();//t1线程等待,t2线程等待。问题:t1等待了,t2能进来吗,等待和睡眠bu一样吗?
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();                         
                        }
                }

3 个回复

倒序浏览
首先,回答你的第二个问题:wait()跟sleep()是不一样的。sleep()睡上规定的时间,线程自动启动;但是wait()之后必须调用notify()或notifyAll(),才能唤醒当前线程。
然后回到第一个问题:t1等待了,t2是不能进来的。但是你能把全部代码贴出来么?我想这个不是主要的问题吧!
回复 使用道具 举报
首先你要明白sleep()和wait()的区别
sleep()方法,线程会暂时停止运行,并交出CPU执行权,等睡眠时间到了线程会继续启动,但是这个过程并不释放锁,也就是说该线程仍然持有锁,其它线程进不来。
wait()方法,线程会停止运行,不会自动启动,要等其它线程唤醒。然后该线程不但交出CPU执行权,并且还释放锁,也就是说该线程不再持有锁,其它线程可以进来。
所以,你的t1和t2线程都进来了,然后都等待了。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报 1 0
明白了,wait()会释放锁
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马