00:00
那么从这个API这个层面呢,它就说了两种方式来创建多线程啊,一种呢,咱们把它叫做继承thread类的方式,嗯,咱们来看这就行啊,呃,咱们把它叫做继承thread类的方式,另外一种呢,我们称作叫实现reable接口的方式,这两种方式呢,我们都讲完了,而且通过这个卖票这个事儿呢,咱们也体会了一下应用,那咱们呢,比较一下这两种方式啊,既然有两种方式,我们开发当中到底用哪一个呀,所以自然而然的我们就需要比较这两种方式啊,比较创建。啊,这个叫多线程也行,或者叫呃分线程也可以啊,或者就直接你发出的叫说创建线程也行啊的这个方式的比较。那比较创建方创建线程的两种方式啊,那么这两种方式呢,我们算是比较一下他们所谓的这种异同,或者叫联系吧,啊先泛泛的说一下,大家如果开发中去选择你愿意用哪个呀,第一个继承词类啊,啊有第二个的,那你得说出来原因是吧。
01:17
为什么要用第一种继承啊,啊,你总不能告诉我说这个实现呢,只有五步,这个有四步是吧?啊这个原因不行啊,嗯,那哪种方式更好一些呢?应该说这个实现的方式要好一些,为什么呢?为什么呀。嗯,咱们在讲这个继承的时候呢,呃,说这个继承在Java的类的层面,它有一个局限性是吧?嗯,你像咱们现在呢这呃这个呢没有具体的场景了,咱们这个卖票这算是一个具体的场景了,你卖票的时候呢,咱们这呢叫窗口,你让窗口去继承1SURPRISE的,总感觉怪怪的啊,就是窗口的话呢,它有可能是不是有它本身的一个副类啊啊,就是它有自己的一套体系是吧?哎,它的副类是谁啊,副类的副类又是谁?现在呢,我们为了让这个窗口呢,实现这个多个执行的效果,咱们呢,只能让它去继承为thad,那你继承thad以后呢,咱们Java呢就是单继承的,所以你就没有办法再去继承其他的类了啊这呢其实相当于是一个弊端啊,YG呢,就是我们这个啊,这是window了啊,你可能是一个其他名的类,这个类呢,如果已经有一个显示的父类了,你再想去用这种继承的方式呢,就做不了了啊,因为有单继承这样的一个限制。
02:51
啊,而我们要是用这种实现的方式呢,是还可以让你去实现randomable的方式去做的,哎,所以呢,通过这个角度呢,我们也只能是用它啊,这是其一,那其二的话呢,通过咱们刚才这个卖票这个例子啊,大家呢,能看到就是我们这个实现的方式呢,你像这个ticket啊。
03:11
咱们呢,不用给它生命成静态的,而我们在这个呃继承的方式当中,必须呢,把它生命成是一个静态的。啊,原因呢,就是因为咱们这个实现的方式,你会发现呢,天然就能够实现这种,呃,或者说就是体现这种所谓的叫共享数据这个概念。啊,咱们把这个new的唯一的一个window对象作为参数传递到多个线程当中,那么自然而然的,我们这个window的对象就相当于使这三个线程的一个共享的数据。对吧,啊,而我们这个在继承的方式当中呢,你这个时候呢,是不是他们三个对象对应的默认情况下,这个TK应该有仨,为了让它共享,咱们才能才得加一个S。而我们在这个里边呢,就不用考虑再去加static了啊,那总结一下什么意思呢?就是如果说我们创建的多个线程啊,一个线程,两个线程,三个线程等等,如果你要是创建的多个线程呢,他们有一些所谓的共享数据,就像咱们这里边儿这个票一样啊,票数一样,如果要是有共享数据,相当于咱们天然的这种实现的方式,是不是就比较适合用来处理这种情况?
04:27
啊,因为你把这个对象呢,作为参数传递到构造器里边,天然它就是共享的啊,你要是继承的时候呢,还必须要加static,甚至有的情况呢,还得需要格外的去处理一下才行啊好这呢,我们把这个呢总结一下比较现成的两种方式,呃,这个呢,我们呃先来说明一下这个开发当中。哎开发中,哎我们呢叫优先选择哎选择我们这叫哎实现哎re接口的方式。
05:04
哎,这个方式啊,那原因啊,就是咱们刚才说到的啊,第一个原因就是实现的方式呢,它没有这种类的单机成这个局限性的限制啊,实现的方式啊,没有类的单继承性的这个局限性啊,这是第一个原因,这也是咱们这个接口出现的一个原因啊,接口出现的原因就是为了打破这种类的单机层的局限性的,那另外一个呢,就是说呃,实现的方式,哎,它呢更适合来处理哎多个线程有共享数据的这个情况。啊,咱们可以把你这个多个线程这个共享的数据呢啊,就封装在你这个实现renoable接口的这个类当中啊,然后这个类的对象哎,就作为参数呢,传递到多个线程的这个构造器当中,天然这就是一个共享数据啊成这呢是咱们这个对比以后呢,这样的一个结论啊那么他们二者呢,有没有这个联系呢?实际上呢,也有啊,实际上也有这个联系,咱们看一下谁呢?看一下这个thread类。
06:21
往上走。啊,走过了再回来你看。你会发现这个thread类啊,它也实现了renoable。反正说白了,这个类里边那个run方法啊,你看我们CTRL一下,哎,我写一个run。在这儿它上面呢,也加了一个over。对,其实他呢,相当于他把人家reable里边那个抽影方法是不是也给呃是不是重写了一下是吧,哎,然后呢,咱们又重写了,其实你呃继承呢,你就是把它给覆盖了,你要实现的就是呃我没有,哎去就是说白了就是你要么呢,像这种继承的方式,这是继承这个,这是thad类哈,这是这个threat类呢,它又实现了这个reable啊第一种方式呢,就是你造一个这个类是它的一个子类,第二种呢,就是说哎,我不去这个这个继承你了啊,你实现了它了,那我也直接去实现它。
07:19
其实我们重启这个run呢,本质上来讲,呃,你你覆盖它,其实呢,它又覆盖它,间接的相当于还是把它给它里边这个run给覆盖了,对吧?哎,是这个意思啊好回过来在这写一下啊,它的联系呢,就相当于咱们发现。这个thread类本身它也是实现了接口。哎,这个情况啊,然后呢,呃,你要非说有一个相同点,那就是说不管是继承的方式还是实现的方式,哎,我们都需要去重写这个软方法。啊哎,两种方式都需要重写这个软方法,然后将哎,将咱们创建的这个线程的这个要执行。
08:10
的逻辑,哎,声明在这个软方法中,哎,这就可以了。啊行,那么咱们这个利用下午这个时间呢,就把这个线程的创建的两种方式呢,就都讲完了,包括这个线程里边常用的一些方法啊,这个大家呢下来呢去熟悉一下。啊,然后明天呢,咱们呃,接着往后讲啊,在后边呢,就涉及到这个叫线程的生命周期,呃,线程同步通信啊,还有最后这个内容啊。
我来说两句