00:00
好,那咱们刚才说了这个,我不想用这个static去这个修饰咱们这个T,那有没有别的方式呢去解决,这时候呢,我们就要引入第二种创建多线程的方式,叫实现reable接口的方式,咱们还是从这个API的这个角度出发,咱们回到最初,哎最终呢,咱们引入的时候呢,在这里边看到说有两种方式来创建多线程,实际上呢,这个文档按说呢,应该算挺权威的了。哎,你要按说面试问说有几种方式创建多线程,哎,你按说哈,说两种没毛病,因为呢权威的就写了有两种方式创建,但是这个文档呢比较旧,说你不就啊这八是八,但是呢,这个写这个文档的这些人呢,在八的时候没有改,嗯,就是偷懒了,或者忘了是吧?哎他呢说有两种方式,还是用以前的那个呃注释写的啊,其实现在来讲呢,5.0的时候呢,又加了两种方式,或者你不算两种先程池,你可以不算一种,但是至少那个Co接口应该算一种,所以这个文档呢,其实应该早就该改一改了,只是他给忘了改了啊,他这呢还是写的是两种方式,这个呢,从JDK1.0开始啊,就写了这样的一个说明了啊,他后边呢忘了改了啊,这是其中一种方式啊,这块是一个例子,然后接着往后看,说起other way,说另外一种方式,用来创建一个线程啊,怎么做呢?声明一个class,让它呢去实现reable接口。
01:24
实现一个接口,接下来说这个类呢,需要去实现这个run方法。因为这个接口当中呢,有一个抽样方法叫run,哎,去实现一下这个run方法,然后接下来我们去造一个当前类的一个实例啊,这个实例呢被分配啊被分配,然后接下来呢,说传递到咱们这个thread的这个参数,这。诶,什么意思呢?就是我们去创建一个thread的一个实例,你看下边这个代码就知道了。嗯,咱们造了一个用了一个thread啊,这个thread的这个构造器有一个行参,这个行参呢,是咱们造的这个实现了renoable接口的这个实现类的对象,哎,把它传到这儿了,哎,然后接下来呢,你就让它study执行就行,哎,Start的方法仍然是调到咱们thre的类当中的唯一的这个start方法,下边呢,举了个例子啊,就咱们刚才看到的这个情况,好,首先呢,根据咱们刚才看到的这样的一段描述,咱们回过来把这个过程呢写一下啊,咱们再去新建一个。
02:34
哎,这个呢,我叫thread还是叫这个test啊,叫一。啊,这呢叫创建呃,多线程的这个啊,这个方式二啊,这个我们叫实现,哎,Reable接口的这个方式,首先呢,咱们根据刚才看的这个API的文档,咱们说一下这个过程第一步啊,第一步我们需要去创建一个实现了啊reable接口的类。
03:08
啊,这第一个啊第二点。啊,这个我们就要重写呢,就比较要重写了,严格上说呢,这个抽象的方法呢,咱们都叫它实现了啊,那需要呢,这个实现类啊,去实现这个reno中的抽样方法。哎,这个抽样方法呢,恰好呢,也叫做润方法啊,这是第二点第三点。回忆一下第三点是做什么的,是不是创建咱们这个实现类的对象啊,看实现类的对象,然后第四步将此对象对作为这个参数呢?哎,我们说传递到哎,Thread这个类的构造器中,哎,然后呢,去创建咱们这个thread这个类的一个对象。
04:07
啊,第四步,然后第五步呢,哎,通过这个thad类的对象,哎,去调用咱们的四大的方法,哎这是这五步啊这五步的话呢,相较于咱们这个继承的这种方式呢,有所不同,那继承这种方式呢,大家也需要去记住啊,咱们去创建这四步啊这个呢,明天呢,咱们就该有考试了,是不是就得考一下这个啊好,这都提示你了啊然后回过来,哎,咱们下边呢,就来做一下这个事情,哎在这个位置,哎咱们呢来一个class,嗯,这个呢,嗯,那会儿呢,叫我这个myad,这个我就叫,呃,比如叫M啊叫M。哎,Thread吧,叫他,嗯,这我就用这个名了啊,然后让它呢,首先叫implements实现一下。
05:00
让接口是咱们说的这个第一步。哎,第一步啊,第二步,人家这里边呢,有这个抽样方法啊,你把那个光标你只要放到这块就行,Out enter一下这块呢,我们去实现这个方法啊,点一下只有一个run OK。啊在这儿,所以第二步我们需要呢,去实现这个转方法。那么下边呢,咱们也是做最初的那个简单的例子啊,就是便利一下100以内的偶数,哎,我for a一下。啊,然后100看if I穷二等等于零,这个呢,我们把这个I呢去s out一下。好,这样来做,这是我们说的这个第二步,然后第三步。创建实现类的对象,这个你就别在这做了,回到咱们这个单专门的这个测试类当中写一个没方法。哎,我们这时候呢,去new一个叫m thread。
06:02
哎,这样,然后在这个位置呢,点了一个al enter,哎这呢,哎就叫ITH可以啊,造了个对象。接下来把这个对象作为参数传递给咱们外的构造器当中。哎,我们这时候呢,去new一个thread,哎,用这个thread的时候呢,呃,在这个位置,哎,我们看到其中有一个构造器的参数呢,就是叫reable,哎咱们的这个叫m thread呢,正好实现了reable,所以这里边其实相当于是不是一个多态啊。哎,这是一个多态的一个形式了啊哎,将我们这个时间类的对象呢,作为参数传递给这个行参是reable的这样的一个构造器了,然后这个位置alt enter一下,哎,我们造好这个我叫T吧,哎,这就造好这个哎对象了啊哎它造好以后啊下一步。哎,第二四大的方法。
07:04
诶,那这两种方式呢,大家就看到了,不管是继承也好,实现也好,咱们要想去启动一个线程,是不是都得是掉start啊,而且呢,都是咱们这个read这个类当中的这个start方法。诶,掉这个就行了。啊掉这就行了啊成,那咱们呢,是按照这个文档说明的,这种情况呢,咱们就给它这个造好了,造好以后呢,咱们执行一下,哎,Run这就出来了。哎,这就搞定,这呢,就相当于咱们是,诶使用这个实现randomable接口的方式呢,咱们创建了一个线程,哎,这个线程呢,就是这个T1这个线程。注意啊,这时候这个线程叫T可不叫它,这不是咱们的线程,谁start这就是谁,这个线程就是谁啊,那么这个大的方法我们发现呢,诶,它怎么也能够执行它呢。
08:01
咱们原来看这个star方法的时候呢,它的API呢,是这样写的,说它呢有两个作用,第一个呢叫启动线程啊,这没毛病,咱们这个启动的就是T线程,第二个作用呢,我们说叫调用当前线程的run方法。当前线程的run方法,它是不是调的,应该是我们这个的这个类里边的run方法呀。确定吗?哎确定咱们呢,讲这个继承的方式的时候呢,说咱们这时候调的start也是调咱们线程的RA,只不过呢,咱们哎定义了一个线成的子类,调这个类中的RA的时候呢,你这样呢,把那个父类的那个RA给覆盖了,所以咱们调的是不是它了,哎也就是说呢,你调start发现过来呢,执行的是你这个逻辑,这个咱们哎比较清晰能理解啊,但是在这块我们这时候调这个start方法,调的是人家这个re的类里边的RA,那怎么就跑到你这了呢?
09:05
是不是会有这样的一个问题吧?哎,咱们调的是人家thread类里的run,你现在你这不是人家你你说你重写了thread里边的这个run也没人信呢。你继承你你实验是他,你继承的是object。啊对,那你要想解决这个问题怎么办。是不是只能看源码了?嗯,咱们调用的是当前线程的run,好了,我们进入这个thread ctrl一下,我们看一下这个run。好,看到这儿了。我们确实调start方法的时候呢,执行的是我们这个thread里的这个run,但是这个run呢,它是这样写的,说如果呢,你这个呢,不等于no,我就调Turkey是Turkey什么呢?点一下是我们TH类当中声明了一个变量。
10:02
或者叫一个属性,这个属性不等于闹的时候呢,诶它就掉,它对你发现这个车呢,就是个randomable的一个类型。其实这时候呢,已经基本上快发现了,咱们刚才去拗对象的时候,咱们用的构造器是不是用的是这个这个构造器,你看它是不是恰好就是这个特别。相当于咱们放到行参的这个叫m thread这个对象,它呢,就拿它去把咱们这个刚才那个属性target是不是给它做了一个这个这个赋值啊,那赋值完以后,当我们去调thread的run的时候呢,呃,又由于你这块已经被赋过值了,它是不是就开始调我们这个RA,不就是我们刚才造的那个对象重写的那个run吗?对吧,哎,所以这样呢,这不就绕过来了。哎,就是大家呢,对这个东西不光唯一形成了,哎,你还要呃深入到里边看一看,为什么是成了啊这个调用当前线程的run,呃主要原因呢,是当前线程的这个run里边它调了谁呢?哎,它调用了,哎调用了所谓的那个叫reable。
11:17
啊,Reable类型的,哎的这个run方法,那这个target不就是咱们这里边的这个吗。哎,咱们把它付付给谁了,就是付给那个了。啊,你看放到这,这不就这个ticket,哎,所以就掉了它的这个run,它的run不就是这个run吗。哎,就这样子啊好,这呢是咱们就呃创建好也执行好了,那接下来再问一个问题啊,这个再启动一个线程啊,然后也是便利100以内的凑数。那这个时候呢,我们,呃,你咱们讲这个继承的时候也说过,你直接让这个T去start,这肯定不对吧,啊,这肯定是错误的啊,那不能这样写了,那应该怎么写。
12:10
哎,至少你得扭个他是吧,那这个还用再扭吗。这个呢,其实就不用了。哎,咱们直接呢就诶共用一个它就行啊,所以这块呢,我们只需要这样,诶这个看CTRLC一下,这个叫T2,哎直接呢T2点我们做一个start就行,大家呢,共用同一个这个数据就行啊,共用同一个它,那这个时候呢,我们调start呢,跟这个套路是一样的啊,最后呢,也会回归到这个对象,它所在类的这个run方法的调用啊,仍然执行的是100以内的偶数好执行。哎,直播这个直行,你看这个效果可能差点意思啊,那咱们在这块呢,哎,加一下这个线程名,这个时候呢,你还能写直接写叫该name,那不行了是吧,知道为啥吧,你这又不继承于thread,你继承的是不是object呀,这里边又没有这些方法,那这块怎么写,是不是只能这样来写了,哎对,只能这样去操作啊,那这样就成。
13:23
好,执行。哎,这呢就是S的杠零,哎杠一啊这呢也有一些交互哎。没有问题,那如果呢,你想给它起名,那你只需要呢,在这个start之前,诶给它起个名就行了,比如说呢,你在这个位置,哎,给它起个名啊叫T一点去set name。哎,这个呢叫线程一。哎,这个呢也类似啊,T2第二啊,Set一下name。哎,线程二,哎,这样就OK了。那就这样。
14:00
行,这呢是咱们讲的第二种,哎,创建多线程的方式。啊。
我来说两句