黑马程序员技术交流社区

标题: 问个多线程等待的问题 [打印本页]

作者: 谭荣强    时间: 2014-4-16 22:39
标题: 问个多线程等待的问题
老毕视频中的,有有点疑问。同步函数的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();                         
                        }
                }
作者: 虎牛龙马    时间: 2014-4-16 23:02
首先,回答你的第二个问题:wait()跟sleep()是不一样的。sleep()睡上规定的时间,线程自动启动;但是wait()之后必须调用notify()或notifyAll(),才能唤醒当前线程。
然后回到第一个问题:t1等待了,t2是不能进来的。但是你能把全部代码贴出来么?我想这个不是主要的问题吧!
作者: 清风夜独醉    时间: 2014-4-16 23:29
首先你要明白sleep()和wait()的区别
sleep()方法,线程会暂时停止运行,并交出CPU执行权,等睡眠时间到了线程会继续启动,但是这个过程并不释放锁,也就是说该线程仍然持有锁,其它线程进不来。
wait()方法,线程会停止运行,不会自动启动,要等其它线程唤醒。然后该线程不但交出CPU执行权,并且还释放锁,也就是说该线程不再持有锁,其它线程可以进来。
所以,你的t1和t2线程都进来了,然后都等待了。

作者: 谭荣强    时间: 2014-4-17 10:52
明白了,wait()会释放锁




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