00:00
好,同学们,接下来我们进入第二种condition接口中的wa和sign方法,来实现现成的等待和唤醒通知机制。那么,同学们。刚才我们完成了第一组,那同样的如法炮制还是同样的思路,看看第二个三角和第一个,它们之间会不会还是一样的错误,一样的要求呢?那么来,同学们走起。那么现在。我们呢?直接过来这儿lock。Lock等于6RE lock,我们呢,就用默认的这这一套啊,Lock点6CONDITION,那么这些是什么?不再赘述,有兴趣可以去B站上去搜索我们上回谷所讲的GC相关的编程。好,那么接下来。第一,和之前一样,那么try look。Look look OK,洛啊洛,那么来吧。嗯,在这块。
01:03
它呢,还是和以前以前一样,Come in对吧,进来了以后,假设T进来了,我看。Wait,那么这有异常,我们加一下,完了以后,假如说wait,它现在被signal,那么肯被signal之后肯定就是什么。被唤醒,我相信同学们这个应该没有太多的疑问了吧。结合前面的案例,那么。老规矩,这呢也同样是停一秒钟,那停一秒钟以后,我们这儿来T2这个线程。那T2这个线程呢?和之前呢一样,他呢也呢是condition,他呢就负责发出通知。结合我们这儿这个呢,是。新的。发出。通知,OK,好,那么同学们我相信有前面第一个三角形啊,第一组这样的案例,这个我就不再赘述了,直接跑就行了。那么来同学们如果不出什么意外,大家都清楚T一进来了,一秒钟以后,T2线程启动,直接signal,那么相当于说发出唤醒的通知,那么T1就被唤醒了。OK,那么我相信这个正常流程同学们不会有任何疑问。好了,那接下来和刚才一样。
02:21
我们把这个锁块。给他住掉。来,右边语法没有标红吧,来吧,把这个锁块给它注掉,此时我们再跑一下,大家看一眼它会产生什么样的效果。来T1确实进来了,这个时候会报是吗?还是exception?那么来同学们T1T220五行。Wait方法这41行。Signal方法,这说明什么?这两个方法和之前的第一组的。效果是一样的,那么马上大家就可以反应过来,也记wait和signal也必须像之前第一组的signize这样的放在我们的什么lock UN lock,也就是说必须要先持有锁在锁块里面,这两个方法才能正常使用,OK,那么来同学们可以看得出,如果我们去掉lock unlo块。
03:18
马上都会报这样的异常,刚才也已经见到过,笔记上都给大家进行了抓图,那么在我们的lock lock段里面才能正确的使用砍地神中现成等待和唤醒的方法,好,那么接下来我们同样的思路,还是熟悉的配方,还是熟悉的味道,我们如法炮制。那假设现在。我们先发出通知,也就是先让signal。执行完成再看看还好不好使,那么来吧。各位同学。搁到这儿,我们呢。把这一行先注掉。拷贝过来一秒钟,先让T1T1先停一下,那么此时。我们先运行signal,来看看T2运行完signal发出通知以后,T1还会不会被唤醒。
04:08
来,同学们,等待程序后台运行,我们可以看得出T2已经发出通知,T1也确实coming进来了,但是非常抱歉,我们的吹哨人,我们的。唤醒者已经没有了,所以说额特只好一直在这儿阻塞,一直在这等待,因为唤醒我的那个配对的sign格已经先跑了,所以说这样的话呢,也和刚才一样,我们会有第二个异常,如果是先signal后。呃,外套那么。我们线程呢,是无法被唤醒的,OK,所以。看一下小总结,我们可以通过我们的总结来对condition这个接口,对wait和signal方法它的正确使用做一个笔记。那么来,首先can定中的线程等待和唤醒方法需要先获取锁,也就是说必须要在锁块里面,第二个一定要先wa后signal,不能反了。所以说通过前面这两种案例,这是我们之前学过的。
05:07
Object类和condition接口使用我们的等待唤醒通知机制两大条件。第一个。线程先要获得并持有锁,必须在锁块要么是thinkized的或者是lock当中,第二个必须要先等待后唤醒线程才能够被唤醒,对吧?不然这个教醒你的吹哨人跑了,你就在那一直沉睡了。那么正是因为有这两个条件限制,故此我们会迎来我们的第三个look port类当中的park相当于我们的wait UN park相当于我们的notify唤醒,那么它又能给我们带来什么样的惊喜呢?那么下面我们就看第三种方法。
我来说两句