00:00
诶,这呢是咱们今天考的这五道问题,这五道问题呢,都是关于我们讲的多现成的,哎,看下这个第一道题,第一道题的话呢,也是咱们昨天讲课的话呢,一上来讲了一个知识,涉及到呢叫线程的生命周期,那线程的生命周期这块呢,大家确实需要关注一下,我们线程呢,在整体执行的过程当中,由于一些方法的调用呢,导致呢,它从一种状态变换为另外一种状态啊,因为这里边涉及到的状态呢,不像咱们一开始讲一个对象一样,咱们讲面向对象的时候呢,我们通过new的方式造了个对象啊,中间呢掉一些方法,这时候呢,相当于这个对象呢,都在内存中被加载了啊,最后呢,这个当我们出了这个对象所声明的一对大括号的时候呢,呃,就算是呢,呃,这个回头被我们垃圾这个收集的这个线程呢,就给回收掉了,出了这段大括号呢,我们就用不了了,这个时候呢,讲这个对象呢,它也比较简单一些,就是出生这块你就使用就完了,最后呢,就是自然而然的出了大括号呢,就算是。
01:00
黄了比较简单,所以呢,我们没有特意的去说这里边呢,它的几种状态啊,因为比较简单了,然后在我们线程这块的话呢,涉及到的这个状态呢,相对来讲就多一些,后边呢,咱们还会讲到其他的一些结构的生命周期,我们需要关注的呢,就是两个事儿,关注两个事儿,第一个事儿呢,就是它的生命周期当中的几种状啊,就是后续咱们讲其他的一些结构的生命周期的时候,大家呀,也需要注意这两个事儿,第一个呢,就是它涉及到的几种状态啊,比如说有这个创建呀,呃,肯定得有一个创建,也得有个消亡,这是肯定有的两个过程啊,以及呢,在当中有的是叫运行的状态啊,有的叫暂停的状态啊,有的叫停止的状态啊,是吧?哎,像我们县场里边呢,啊,阻塞的状态啊,就绪的状态啊等等,就是你需要关注一下这个结构的几种状态,这是第一个事儿,第二个事儿的话呢,我们要关注的就是在这些状态切换的过程当中,哪些方法会调用,诶哪些方法会调用,这就。
02:00
涉及到一个方法的问题了。方法的问题,这呢应该算是有两两两种情况哈,一种情况呢,就是说我们这种状态变换成另外一种状态的时候,从这种状态变换成这种状态的时候,这个呃,当你变换状态了,某一个方法自动的就掉了,某一个方法自动的就掉了,那这种呢,一般我们都称为叫一个回调方法了,那这时候呢,大家需要关注的时候,就是哎,我们这种状态到这种状态的时候呢,哪个方法掉了,如果大家需要做这个事儿,你就在你这个相应的这个回调方法当中,你去写这个逻辑。那比如说啊,这个还是比较形象,大家我们举这个这个手机大家用的这个页面哈,这个页面的话呢,其实它对应的我们昨天也提过,哎哟,诶昨天也提过,它其实应的是一个叫activity这样一个类啊这个类的话呢,就是你一打开这个手机的某个应用的某一个页面,你能够看到它说明当前对应的这种状态呢,它就是一个运行状态了,因为你现在能看到它啊啊这个运行状态,然后这个有的时候呢,我们这里边有一个小的,比如说一个组件了,你一点它可能出来一个dialog啊,比如说呢,有的时候我们这个一点的话,他问你是不需要退出啊,说是是不需要这个这个打开一个新的这个这个这个什么页面啊等等,它会有这样一个提示框,这个提示框呢,它并没有把后边整个这个activity给覆盖住,只是盖了一部分,后边这个也能看着,但是呢,你操作不了后边这个,呃,像这种情况呢,这个activityt认为它就变成了一个叫暂停状态了,那么这个时候呢,它从一个运行状态变成一个暂停状态,这个时候呢,它会,呃,有某一个方法会执行。
03:40
哎,你需要关注的就是你在运行到暂停的时候,你是不是需要做一些事儿,如果你需要做一些事,你把那个事儿呢,就写到运行到暂停那个状态当中,那个回调方法里。就这涉及到是由状态啊变化引发的某个方法的执行,哎,你需要做相应的逻辑呢,你就在里边写啊,再比如说呢,你这个有一个返回键,我这一返回把这个页面呢,整个就退出了,应用也退出了,相当于整个这呢就销毁了,相当于它从运行状态呢,直接就奔到销毁去了,如果你在销毁之前需要做点事儿,你就写到销毁之前那个方法当中,嗯,这是由状态的切换导致某个方法的执行,那我们把这方法呢叫做回调方法,大家呢,去这个回调方法里边,如果你需要呢,写相应的逻辑,这是这个情况,咱们现在讲这个线程呢,反过来了。
04:31
线程的话呢,是我们由于某个方法的调用导致状态的切换啊,本来呢,它现在是一个运行状态啊,然后呢,我们由于调用了另外一个线程的join方法,或者我们调用了当前这个线程的sleep方法,导致呢,我们当前的线程呢,从运行到阻塞了。哎,就是是由方法的调用导致状态的切换。哎,就是反过来了,就可能是状态切换了,导致方法执行了,有的呢,是方法的执行了,导致状态切换了,这是有两种情况,后续呢,大家只要涉及到生命周期,就关注这两个事儿,哎,你去关注状态,关注方法,哎具体需要做什么事儿,肯定还是主要考虑方法里边的,呃,这个逻辑需要大家去重启的,你就去写就完了啊就这个意思,好,那么具体到这个线程的生命周期这块呢,嗯,就不想在这多说了,一会儿咱们也复习啊,咱们画了一个图,需要大家呢能够把这个图呢画出来,因为咱们整个这一章当中,这个创建多线程也好,线程的同步也好,包括后边讲通信也好,我们确实的掉了很多的方法,那么调哪些方法导致这个状态怎么变化了,这个你得清楚啊,所以这个事呢,大家需要掌握啊。
05:43
这个我就不提问了。第二个问题说同步代码块这一说,这就应该都得知道啥意思了啊,同步代码块当中涉及到同步监视器,我们说非常重要的两个结构,一个呢就是同步监视器,一个呢共享数据。
06:01
这是两个非常重要的结构,谈谈的你对同步监视器和共享数据的理解以及注意点,哎,找个同学来说一下,看你是怎么理解怎么写的。嗯,五号前。啊,这个你没写,这个咱们昨天讲的时候呢,花了很多的时间啊,而且我也反复的强调这个比较重要一点,不写不应该。啊,这个应该得你就是昨天复习的时候呢,也得好好的把这块看一看啊,这块你要没整清楚的话呢,这边是关于同步这块使用呢,还是会有问题的。嗯,这个这个一定要下来再看看,那刘家辉你说说。你说哪个同步健身器啊啊,它是一个对象。
07:03
嗯,就是我们这个S的这个单词大家会写了吧,YRO,诶这个呢,单词比较长啊,需要大家会写,诶这呢就是一个同步代码块的结构,在这个小括号当中我们写的这样就叫同步接然器行,那它有什么要求啊。统一,统一的对象是什么意思?嗯,对,对于谁来讲是共用一个对象。多个线程对多个线程要使用这个同步监视器的话,就是使用同步的话呢,哎,我们保证这个同步监视器必须得是同一个同步监视器,那我们讲是叫同一个锁是吧?啊一个意思啊,那么另外的话呢,这个同步监视器咱们也提到了,它呢首先是一个对象是吧。诶,它是个对象,而且呢,我们说是任何一个类的对象都可以来充当的,在这一方面呢,没有要求,唯一的要求呢,就是大家要,哎共用同一个同步健身器,哎这个大家要注意啊,行,这个呢其实就没了,然后共享数据呢,什么是共享数据啊。
08:19
共享的。多个线程共享的数据啊,简称共享数据是吧?嗯,对,能能理解就行啊,就是多个线程共同操作的一个数据,哎,就叫共享数据了啊,那么共享数据我们在使用这个同步代码块的时候呢,需要注意的是什么呀?是一个操作另一个。对,那就是啊,一个线程操作共享数据的时候呢,另外其他的线程就不能再去操作它了,如果要一操作呢,是不是就出现这个安全问题了,是吧?所以呢,咱们才使用同步,在使用同步的时候呢,需要特别关注的就是我们这一对大括号,大括号当中呢,包着的是什么。
09:13
有同学说包着的是代码块,这个不用你多说了,大括号里边包着的,那还能识别的不都是代码块嘛,是吧?啥重启的转方法?这个大家掌握的不好啊,这个呢是确实是咱们这一章的难点,但是呢也很重要,需要大家下来呢整清楚,一会儿复习的时候呢,再强调一下,然后我们这个C的这个大括号当中包的呢,就是操作共享数据的代码嘛。对吧?哎,我们的目的呢,不就是把这个大括号包着的这个数据呢,保证它在这个执行的过程当中是个单线程的嘛,哎是个单线程的,这这样的话呢,你是个单线程呢,这不就保证别的线程进不来了,哎,所以呢,我们呢,哎怎么能保证线程安全呢?就是把操作共享数据的代码呢,给它用S包起来,诶这里呢,需要注意的问题就是你包的时候啊,对你别包多了,也不能包少了。
10:22
包少了好理解,肯定不对了,你相当于本来人家这个四行都是操作共享数据的,你包了这俩,那这俩呢,意味着呃,一个线程到这儿,假设有可能阻塞了,然后另外一个又过来,这不又又乱了啊,有两个又同时操作了啊,这个你包少了不行,那你要包多了呢,咱们昨天也演示过呢,也不行,卖票的时候呢,你把那个well处也包进去了,那成了一个县程,拿到锁以后呢,一顿打印把票都卖完了,别的县程参与不进来了,实际上就完全是一个单线程啊,没有什么意义了,就啊,哎,所以呢,这块要注意的就是不能包多了,哎,也不能包少了。
11:00
行,这呢是咱们说的这个同步代码块里边的这两个非常重要的结构啊,那么同步方法,同步方法里边呢,实际上呢,也同样的会涉及到同步健身器和所谓的共享数据了,哎,你这个同步方法的方法起自然而然的就是操作共享数据的啊,那么它的同步监视器的话呢,我们说是默认指定的,不用你再显示的去声明了,那么大家需要掌握的就是同步方法当中的同步间然器是谁?你得知道,因为呢,咱们有要求说呢,保证多个线程得共用同一个啊,因为它是默认的,你改不了了,但是你得知道它是谁,比如说你改了你那个方法是个同步方法,结果呢,最后发现还是不安全的啊,你得回来去知道啊,可能你这个同步监视器呢,因为大家多个线程没有用同一个同一个锁。啊,那么这里边儿咱们讲到的知识点啊,说这个方法当中同步方法当中的同步监视器是谁呢?找同学说一下。
12:15
嗯,是这次说的完整一点。又成当前泪点,Class,你把这个话说完整了,现在的问题就是同步方法当中的同步监视器是谁?怎么说当前泪点,当前泪点Z啊,当前类什么的对象啊,那我要是个静态方法呢?
13:01
这块应该还是不清楚了啊,那你说说呃,大点页啊呃,当前类的对象,这个有没有什么前提啊,上来就当前类的对象呀。啊,这也也不清楚了。谁谁给说说。这个同步方法当中的同步监视器是谁,这个怎么说?咱们昨天那个课件里边,这不都写的非常清楚吗。你看我这咋写的。同步方法当中仍然涉及到涉及到这个同步监视器,只是呢,我们不需要显示的声明就是默认的,那么具体来讲,对于非静态的同步方法,同步监视器是这次静态的同步方法的同步监视器是当前类,本身能理解不,这得清楚啊,这个不往清楚,你你还得记住它,这个记的话呢,也没有必要大家死记硬背了,这边其实也是很自然而然的事情吧,你这个方法呢,是一个非静态的,咱们说了就是当前对象了,因为咱们在这个同步代码块当中,这不咱们也写过吗?
14:29
咱们这前面呢,是不是也涉及到过这个同步监视器,我们写的时候呢,你可以呢,指定一个具体的对象,那同时呢,我们说也没有必要非得去拗一个了,我们直接呢,就用当前对象就行,本身它就是唯一的啊,我们就用它就OK了,那自然而然的话呢,我们在这个同步方法中呢,它默认呢就用的是Z4。啊,这是对于同步方法,那么静态方法的话呢,我们前面讲面向对象也提过,静态里边是不可能掉这种Z啊super的。明确说过的啊,你这个静态的结构呢,随着类的加载而加载,当前哪有对象啊,所以呢,大家刚才一上来就说啊,当前对象这是错误的,那我要是静态方法,这时候连对象都没有,那对象没有那谁啊对,那就是类呗,因为这个类的话呢,咱们被这个类的加载器,咱们具体到反射的时候呢,再详细的说啊,类的加载器加载的时候呢,它就加载了一份啊,自始至终就这一份,那就保证了这个这个当前类呢是唯一的,那唯一的话呢,我们就可以去用它了,所以呢,是当前类本身啊,就类点class。
15:34
嗯,啊,这个呢,咱们是不是一个静态的了啊,这个没有涉及到了,咱们这个讲这个懒汉式的时候,这不是在这呢涉及到了啊,这个呢是有难度,但是大家呢,不清楚的下来一定要弄明白,这个呢很重要,虽然说我们讲这个同步的时候呢,没涉及到多少代码量啊,但是呢,那这里边这个逻辑呢,是非常重要的啊,涉及到这个概念怎么去包,这是有技术含量的,就有的时候呢,我们这个所谓的技术含量不是说在于这个代码量的多少啊,而是在于你这个,呃,核心的这个点呢,是不是能够把握清楚,那对于我们这个同步代码块来讲,这两个就是核心啊。
16:15
嗯,就跟以前看到一个,以前那个读那个这个青年文摘的时候呢,看过一个例子哈,说呢,嗯,国内呢,买了一台这个大的设备,从日本进口的是吧,这个设备的话呢,一开始用的挺好,后来呢,用了一年多以后呢,没有及时维护,出问题了,出来以后呢,就大家就开始去修,呃,那咱自己的话呢,这些人都是一些技工了啊,这个常见的一些小问题能够解决,然后这个呢,就是怎么弄也弄不好,看说明书呢也不行,后来呢,就把人家日本这个专家呢就请过来了,请过来以后呢,就是听了这边这个实际操作人员解释这个问题以后,然后呢,人家直接呢就在某个位置画了个圈,说这里边出问题了,诶哪个哪个件坏了,诶打开以后呢,就给画上了,哎,果真就好了啊,这时候要多少钱呢?啊,要这个1万美金是吧,说哇,就画了个圈要这么多钱啊,那你得看这个你画的圈跟人家画的圈不一样是吧?哎,人家呢,对这个东西呢,极其清楚了,哎,那就需要这个长期的一个积累一个功底了,哎,这个直接画个圈,这。
17:16
接就定位这个问题了啊,你呢那个瞎画那肯定不行啊,所以呢,你得把握这个核心的这个东西啊,下边一个问题,Sleep和wait的区别,还是找人来说。陈述天,嗯,第一,嗯,第一个呢是位置不同,怎么叫位置不同。嗯。第一个是在哪里?里,嗯,第二个呢,Wait是在object里啊好,这是一个区别。
18:01
什么不同啊,他们可以声明的位置不同,嗯。嗯,然后wait呢,只能生命在同步代码块或同步方法中,嗯。还有吗?Sleep的话呢,就是我们指定一个时间,到了那个时间以后呢,它就自动的结束阻塞了,那那wait呢,需要被notify或者notify all唤醒,这个时候呢,它才可以结束阻塞,对吧?嗯,没有了,还有一个关于是否释放锁的问题。你要是在这个厕所当中把门一锁,相当于你这时候同步了,别人进不来,然后你睡着了,这个门会开吗?不会开,不会开相当于什么呀。
19:14
不会主动的去释放锁啊,那wait呢。为了会啊,这个答的呢也也一般啊,就是虽然说这几个点呢,都说到了这个,加上最后一个提示,但是给人的感觉呢,就是不熟啊,包括呢,你看哎,你今年应该不大是吧?啊就是能感觉出来啊,啊就是给人的感觉呢,不够老练是吧?啊就是这个不熟啊,这个要熟,像这些问题呢,大家不能保证,不不能光是说啊,这个我我想半天啊,我想了这个十分钟,我把这几个点都说全了。这个不行,就是这个东西呢,应该是比较熟的啊,相当于呢,你直接就可以说出来,比如说这个知识点有五个点,有五个点,你可能很快的就说出来四个点,这个其实也还好,总比你这个吭哧吭哧吭哧半天,然后呢,响了十分钟20分钟啊,我把这五个点补全了,这样不好,这样说明你的不熟,那五个点的话呢,我们很快说出来四个点,那说明这四个点因为你用的比较多啊,所以呢,你比较熟,这是正常的,那个点呢,可能这个很犄角旮旯的时候呢,我们才会去用得到啊,就没有记得起来,这个呢也是可以的。
20:22
啊,这两种状态呢,你得清楚啊,下一个写一个线程安全的懒汉式,这个呢就不说了,一会复习的时候呢,写一下啊,再粘过来看一看,需要大家会手写。下一个创建多线程有几种方式?几种啊,四种啊,那么哪四种。继承thread类实现reable接口,还有呢叫实现,哎call接口,最后一个使用线程池,那使用线程池有什么好处呢?这个呢,就是我们说叫响应速度提高了。
21:15
这个呢,用不着你自己每次去拗了,这个我都给你写好了,你直接拿过来用就行是吧,响应速度呢,就提高了,提高了用户的这个体验,那同时的话呢,你用完以后呢,也不是销毁了,而是还回来了,是不是就提高了这个资源的重率啊啊。这个呢也就比较好了,那现在这不都讲究这个环保是吧,这个能重用的,我们就就尽可能的去重用啊,那这是一个事儿,然后最后一个呢,诶便于管理,就是说呢,我们可以设置一些这个属性,然后呢,去限制我们这个线程式的一些创建,包括它的一些维护啊,可以体现这个管理的一个思路啊。成这个呢,就需要大家呢,能够根据自己的理解呢去说出来,你就拿着咱们实际生活当中提的那个例子,就是你去这个天安门,这时候呢,你是自己造一辆自行车去,还是说呢,你直接坐公交车或地铁去,那这里边儿呢,就体现了这样的三个点。
22:14
好,这呢是咱们讲的这五道问题。
我来说两句