多线程基础——wait和sleep
sleep()方法是Thread类的静态方法,实际上就是线程暂停
Thread.sleep(1000);
上面这条语句就是指向城暂停1000毫秒,线程暂停 顾名思义我只是暂停在这,并不会释放我的锁,其他线程想要抢我的锁,除非你能interrupt,否则休想。
wait()方法是object类的固有方法,当线程执行到wait时,就知道自己的时间到了,要去等待队列那等着被召唤,最可气的是,竟然还要释放持有的锁。这让线程很不高兴。
对于一个实例对象,只有一个锁,当线程遇到synchronized修饰的代码时,只能拼命的抢,狼多肉少,岂止是少,是只有一个。如果这个类里面只有一个被synchronized修饰代码块还好,若是很多个方法都被修饰就惨了,要是有一个线程A抢到了锁,执行自己的那个方法,其他线程只能眼巴巴看着,即使自己要执行的那个也被synchronized修饰的方法,不是和线程A一样的也要等着,好气啊。这时候这些等待的线程就无比期待线程A能够遇到wait,因为遇到wait就意味着线程A要释放锁,并且还要被关到小黑屋里面去(等待队列),他们就可以愉快的抢这个锁了。这时候线程A在小黑屋里面就想啊,谁能来救救我啊!!等啊等,终于有一天一个线程B拿到锁之后,开始执行代码,执行到notify,一看是要去小黑屋里面把线程A叫起来。这时候线程B就说:“嘿,哥们儿,别待着了,快起来”。线程A:“终于要重见光明了”,线程B:“别高兴的太早,我叫你起来,只是要你过来准备,并不是立马开工,你要想开工,等我把我的活干完,释放了锁再说”。线程A拍拍屁股,屁颠屁颠的跑到准备位置站好,等待争抢线程B释放的锁。
后来有一天,线程A又被关进了等待队列里,这次他等了好久好久也没有人来叫他,后来发现这个小黑屋里面不仅只有他一个人,一个社会经验比较多的老人 说,“别着急,等着吧,听说一会有个notifyAll要把咱们一起放出去呢!!”果不其然,一个线程w拿到锁之后,执行代码,执行到了notifyAll,就去小黑屋里面把所有等待的线程全都放出来了。“来来来,你们都出来,一起在这等着,一会我把我的这点活干完,就把锁给你们。到时候你们谁先抢到,谁先执行。”
本来还想一本正经写,写着写着就乱了。
总结一下wait,sleep
执行wait的线程必须持有锁,wait时线程进入等待队列,并将锁释放,只有notify和notifyAll才可以将等待队列的线程唤醒,能够执行notify和notifyAll的线程首先也要持有锁,notify或notifyAll并不是立刻就将锁给被唤醒的线程,需要当前线程执行完才能将锁给被唤醒的线程
sleep只是线程暂停,不会释放锁,休眠时间到自动开始执行。若是想要打断sleep中的线程,只能用interrupt