00:02
来咱们开始上课啊,我们先那个回顾一下,我们这个上节课这个线程这块的东西啊,我们先回顾一下。来我们把这个打开啊。把这个打开,呃,这个第一个例子啊,最主要是想给大家挖个坑啊,就是呢,问大家这个程序啊,它的这个线程的一个数量。那当时呢,有几个同学啊,回答是有问题的是吧,有说呢是三个的对吧?哎,好嘞好嘞好嘞好嘞,知道了啊。嗯,有的说呢是这个三个的,有的说是四个的,是不是也就说是一个的,其实是一个对吧?嗯,我们除了垃圾回收线程之外呢,只有一个主线程啊,因为这个主线程对应的是主站,然后呢,这个站呢啊,我们是主站的方法是闷方法,闷方去调M1 M1呢去调M2 m2呢去调M3,实际上是在一个站当中的啊,当时有几个同学跳到坑里了啊,然后这块呢,咱们。
01:03
讲第二个例子的时候呢,就给大家说了。哎,我们这个线程啊,它这个实现有两种方式,第一种方式呢,是继承这个thread啊,我们在这里已经写了,对吧?继承这个thread,然后呢,重写这个run方法,我们直接new这个对象,然后呢,我们直接去调的方法启动就可以了。那么这个线程呢,t.run和t.start它是有区别的啊,区别在哪呢?首先呢,t.run呢,它表示啊,它是普通方法调用,不会启动线程,只是一个站。普通的main方法,然后调用t run run方法把闷方法压住在一个站当中,那如果是t start呢,它其实也是把我们的闷方法压住,只不过这个start方法呀,它执行结束之后啊。他很快就结束了啊,因为他的任务啊,不是执行这个程序,明白吧,因为t stand它的任务是什么呢?是启动一个分支线程。只要线程启动起来,这个活就算干完了,这个29行代码就结束了啊,然后紧接着往下执行什么呀,哎,我们的第诶30行31行的代码。
02:09
这样的话就可以完成多线程并发的一种感觉了,啊,多线程并发的感觉,这是第一种方式,那么第二种方式呢,我们在这里也讲了。对不对?第二种方式,我们在这里编写一个类,实现一个接口,对不对?然后我们创建线程对象的时候,我们先new一个这样的类型。先把这个类呢拗出来,呃,这个拗个对象之后呢,把对象作为参数呢,传给这个这个类的一个构造方法啊,传给他。就可以啦,然后呢,调用star的方法启动是不是,当然这里还可以,还可以直接这样写。对不对,哎,两行代码组合起来。那么这种方式呢,我们说了它会更常用一些,因为一个类呢,去实现了这个接口之后,它保留类的继承,它还可以去继承别的类。另外还有面向接口编程的这种习惯啊,所以说我们接口的这种方式可能会更常用一些,那么再往下第四个例子呢,我们主要是说的什么呀?哎,我们主要说的是采用匿名内部类的方式,对吧?其实这个roundable是一个接口了,那既然是接口,我们new一个接口来实现类,只不过这个类怎么着啊,没有名字。
03:17
对不对,哎,没有名字。啊,这个写法很诡异,对不对啊,很诡异啊,但是呢,你习惯了就好了啊,习惯了就好了。那么这个呢,是我们这个昨天呢所讲的内容,当然除了写这几个例子之外呢,我们还讲了一下关于线程的一个生命周期,对不对,哎,把这个线程生命周期打开啊。打开之后呢,右边呢,你会看到有这么一个啊窗口对吧,叫model explorer啊,然后接下来把这个线程打开,这里有一个哎状态是不是把线程生命周期打开就可以了啊,然后这块呢,我们这个主要是五个状态,一个是刚拗出来的叫新建状态。然后呢,我们调用我们线程的一个大的方法之后呢,表示启动线程对不对,那么启动线程的这个线程进入一个叫就绪状态啊,就绪状态,就绪状态的线程可以什么呀,有权利抢夺CPU的时间片了。
04:15
如果他抢到时间片之后呢,他就开始执行run方法了,Run方法的开始执行标志着什么呀?进入一个状态叫运行状态,对不对啊,运行状态,那么也有可能在运行状态怎么着啊,它时间线时间片用完了,用完了那那它会再回到就绪状态,继续抢夺CPU时间片抢到之后再回到运行状态,继续什么呀,上一次的run方法往下执行。啊,继续上一次的方法往下执行啊各位。当然在运行过程当中啊,如果遇到了这个阻塞事件啊,这个阻塞事件有很多对不对,诶,比如说像这个接收用户键盘输入啊。对吧,像sleep呀,都属于阻塞,但是你要记住一个线程如果受到阻塞之后,他会放弃他手里所占有的这个CPU的时间片。
05:05
原先比如占了一分钟时间片,他遇到阻侧支线,它会把一分钟给它释放掉。因为释放这个这个这个CPU时间片的目的是为了什么呀,为了前边这个别的线程它可以去使用啊,你不能占着茅坑,不那个啥呀,是不是,所以呢,这个时候呢,我们进入阻塞状态,当我们阻塞有可能解除了,比如用户呢,现在输入了是不是或者是sleep睡眠睡眠时间过了。那么这个时候呢,哎,这个时候呢,我们这个线程啊,阻塞解除了,那阻塞解除之后呢,接下来诶,它并不是直接进到运行状态,因为没有时间片,所以还要回到就绪状态,继续抢活CP时间片,然后再回到运行状态,直到我们的乱方法执行结束,我们进入一个死亡状态,所以线程生命周期一定要记住,它五个状态,有新建就去运行阻塞和死亡啊,大家一定要死记硬背,把它背会,另外我觉得大家要把这个图印到脑子里面。对,这个是出生,这是死亡啊,这个中间有三个这样的状态啊,它是一个怎样的一个过程,另外我们生命周期当中,就绪状态和运行状态是频繁切换执行的。
06:09
啊,切换在这儿执行。啊,你比如说T1线程和T2线程两个线程大八一启动之后,T1和T2在这都就绪了,T1T2跟啥抢抢十面T1先抢到了,先先运行对吧,运行结束之后回来,然后T1和T2继续抢,T2抢到之后执行对吧?哎,那这样的话就可以完成多线程并发的感觉了啊多线程并发。那么是这个各位啊,这个是昨天啊,我们讲的讲过的一个内容啊,讲过的一个内容,我的就回顾这么多吧,啊就回顾这么多,其实也可以再看一下我们这个笔记啊,看一下这个昨天这个笔记这一块都记了什么,上面这是一个流是不是,哎,Object input output stream这一块。有一个叫序列化接口,可序列化的接口,另外建议手动的把这个序列化版本号,这个这个一定要一定是这样写的啊,这个单词不能这不能不能随便写啊,不能随便写,昨天有个同学问我,老师这个名字能随便写吗?不行。
07:04
你随便写一个的话,那个还会生成生成一个这个这个这个这个Java虚拟机还会生成一个,呃,这样的一个属性,各位啊,你写的那个就没有用了,对吧,你先把这个名字占住,Java虚拟机就不再声明了啊,不再声明了。那么再往下呢,我们嗯说了IO流和properties联合使用是不是map集合对吧?和配置文件还记不记得这叫什么配置文件叫属性配置文件对吧?哎,这是IO流这块的一些东西啊,再往下呢,说的是线程,那线程这块呢,大家注意这个进程跟线程的一个关系,大家注意啊,另外线程什么内存是共享的,大家注意。那就在这里呢,我主要给大家说了一下,堆内存和方法区,内存共享,占内存独立,就一个线程一个站,十个线程十个站,100个线程100个站,对不对?占内存是独立的,你是你的站,我是我的站,但堆只有一个,方法区只有一个啊行吧,这个呢,咱们就回顾到这儿吧,啊,就回顾到这儿。
我来说两句