00:00
大家好,我是海波老师,我们继续来讲加语法中的线程啊呃,我们这里呢,拷贝一下我们的代码,咱们拷贝一个新的啊,写个零四,然后呢,我们后面呢,写上一个下划线,然后写上一个wrong啊,咱们点击OK。点击OK以后,把我们这里呢,我们去掉啊,咱们去掉,去掉以后呢,我们写上它,咱们就运行,诶可以了,那么咱们之前讲到了,咱们再去使用线程的时候,我们自己呢,可以定义线程来,咱们写上咱们叫todo啊,我们叫做自定义啊我们的线程,那么我们自定义线程啊,我写个class,我们叫做my thread。好,写上一个三放过来,你这么写行不行呢?肯定不行,为什么呢?因为咱们自定义线程的话,你随便写个类是不行的,我们必须要遵循我们现成的规则,所以我们的第一步。我们应该继承我们的县城内。啊,就是我们的福类了,对不对,哎,就是我们的负类,所有的线程都应该继承它,所以呢,我们这里写上它,我们叫做thread。好了,写完了以后,那它就能运行了吗?不行,为啥呢?逻辑在哪啊,你没有告诉我们这个线程要执行的逻辑对吗?所以呢,我们的第二步也很重要,我们要重写我们当前线程的方法,咱们叫run方法,重写的方式呢,我们这里采用快捷键,我们ctrl o啊里面有一个run方法,我点一下点就OK,那么然后呢,在里面呢,我就直接写上了,咱们打印。
01:23
打印以后呢,我写上它,咱们叫T3啊,咱们叫做线程执行,OK好了行了,同学们,那我把这个线程定义好之后,我在这边不就可以运行了吗?所以拷贝拷贝以后先把我们的对象构建出来,我们的T3。然后呢,它等于new a放过来,放过来以后我们的T3我们点一下叫start,因为我们的线程对象它的启动之后才有可能运行,对吧,那好了,那么接下来我们打印,打印以后我们写上叫闷啊,咱们的线程,诶执行完毕,诶就执行吧,好了,那我现在呢,就准备点击右键,咱们试一试运行。
02:02
运行以后咱们看结果啊,哎,没有问题,我们的main线程执行,我们的T3线程执行,对吧,没有任何问题,哎,老师,那如果我再想创建一个线程怎么办?我再想创建一个线程的话,我是不是又拷贝了一个类啊,所以我们拷贝,拷贝以后呢,我们这里把它改成我们的是,然后呢,我把这也改成市,诶就这么简单。哎,老师啊,那用起来是不是也是一样的呀,没错,我们用的时候呢,跟刚才完全一样,我把咱们的这个位置呢,我写上它,咱们叫做T4。然后呢,我们这写上一个T4就可以了,那好了同学们,那么我们现在呢,运行一下,你会发现我们当前的T3和T4,诶,我忘了改了吧。哦,我这写错了吧,我好像没有注意是吧,我忘了把这张改成四了啊,这个类型没有变,我说呢。好了,那么现在呢,我们运行一下,运行以后看结果,你会发现我们当前的T3和T4的线程,包括那个主线程是不是都在运行啊,哎,所以啊,说明代码没问题,我们的程序的执行也没问题,哎,老师啊,为什么这个T3线程它在前面执行呢?很简单呢,我们讲过了,只要你的线程对象干嘛呀,它开始启动的话,它就有机会执行了吧?诶,我们以前为什么这个主线程在前呀,是因为我们有准备工作呀,可是有没有发现我们在主线程当中,我还创建了一个对象,我又去启动它了,那这个过程可能会消耗一定的时间,它就有机会,什么呢?让T3线程先执行,所以咱们前面讲过了,我们线程之间其实是异步的,什么叫异步呢?你做你的,我做我的他们没有什么先后顺序,所以也就意味着谁先打印谁后打印其实是不确定的,对吗?好了,这个咱们就说到这儿了啊,那说到这儿了以后,其实呀,我们感觉上好像没什么问题,但是从面向对象的角度来讲就有问题。
03:47
题了,诶老师什么意思啊,为什么这么说呢?因为啊,咱们之前讲过了。我们在去设计程序代码的时候,我们什么时候会考虑到去设计一个类,大家想一想。是不是因为在我们解决问题的时候,会分析出很多的对象啊,然后将这些对象共同性的特征和行为咱们抽取出来,形成特殊的语法结构,这个语法结构不就是咱们的class类嘛,对不对?所以啊,我们创建一个类的最基本的目的是什么?就是为了通过我们类的模板去创建多个不同的对象,对不对?
04:22
那如果你说我就为了创建一个我们先能对象,我就创建一个类,为了创建一个限能对象,我就创建一个类,你觉得这个还是面向对象吗?好像不太是了吧,是不是感觉有点不太合理啊,对不对,当然了,咱们那个学的那个单例模式,咱们例外啊,那个单例模式那个类就那么一个对象,对不对,那个例外不说了啊,我们的代码其实就是为了创建两个不同的线程对象,然后呢,执行线程中的打印语句。诶,那如果不这么写代码的话,我们能不能也实现同样的功能呢?那我们该怎么做会好一些呢?其实大家想一想咱们的目的是什么?咱们的目的就是为了启动我们的两个线程来执行不同的逻辑,对吗?那能不能啊,我就写一个类呢?
05:06
别写两个类了,就写一个类,哎,老师不对啊,那你要写一个类的话,这个方法中不只能写一段逻辑吗?那我一个类我能不能加一些什么属性啊,对不对,把这个我们的这个打印呢区分开不就完事了吗?所以啊,咱们想一想这么做可不可行?哎,咱们试一试啊,来咱们拷贝一下,我这里写上它,我们叫做什么呢?我们叫做五。然后呢,我们把这个地方呢,我加一个属性,我写上它,咱们叫provide,我叫string啊,我们叫做RI name好写完以后呢,这个属性呢,我希望呢,我们从外面传进来,我在构建对象的时候,把这个我们的名称传进来,这样的话里面就不用固定写死了呀,所以我们PA在我构建我当前线程对象的时候,把它传进来,诶放过来,放过来以后这个构造方法呢,我写上一个string,给个name,然后把这个属性值啊,诶给它附上,所以我们等于name就可以了,哎,比较简单对吧?好,那我运行的时候同学们这还能固定写时吗?不能了吧,我这是不是应该把那个线程的名称给我拿过来呀,所以拷贝。
06:10
拷贝以后大家可以看到我这么写不就行了吗?你这样的话,一个类,它里面的这个打印的逻辑是不就区分开了,来咱们试一试啊,咱们在前面把这个给它注掉,我注掉以后我也是来两个现成的对象,但是我们类的名称都统一用它了,叫my thread5。好了,我写上一个,咱们叫T58,它等于new啊,咱们这么写,写完了以后不要忘记,我们要给他传个参数,我们就写上它叫T5就可以了,那么接下来我再创建个对象,我叫T55,诶对吧,两个五了,这里呢,我也写上两个五,好吧,写完以后不要忘记我要启动它,所以T5我们我们还有T55,第二我们的start可以了。行了,同学们,那我现在把这个写完以后,咱们运行一下不就完事了吗?好了啊,我们现在运行一下,运行以后大家会发现没有任何的问题,对不对,我们的两个线程就开始运行了,而且谁先谁后不是不确定吗?哎,就是这样啊,诶行了,同学们,那这个不挺好吗?这样的话不就满足了我们的要求,我们就一个类,然后呢,我们还能实现不同的逻辑,你说这不挺好吗?对不对?但是大家有没有感觉啊,我们这个写起来有点复杂了呢。
07:20
我就是创建两个线程,执行两个简单的打印逻辑,怎么代码还变得复杂了呢?能不能再简单一点呢?诶,告诉大家,其实是可以的,在Java的线程中啊,它提供了一种构建线程的方式,就是说你把你想要执行的逻辑传给他就行了,什么都不需要,也就意味着这个类我其实是可以不需要的,这里给大家去解释一下,把这个做掉。做掉以后呢,我们来写上它啊,来写上它,我们构建啊咱们的线程对象时啊,对象时咱们可以呢,只把我们的逻辑啊传递给我们的这个对象,这是完全可以的,哎,老师这个该怎么写啊?来同学们,我们写个thread,我们写个T6,它等于new right,老师,不对呀,这个线程咱们之前提到过呀,它没有逻辑在里面,对不对,我刚才说过了,它没有逻辑,但是我们可以把逻辑传给他,也就意味着我们不用自己写这个类了,我们就用它就可以了,你把逻辑代码传进去就可以,老师怎么传呀?
08:22
那么传的话,它有一个特殊的规则了,咱们说一下传递逻辑时啊,传递逻辑时它需要啊遵循我们的规则,这个规则是什么呢?很简单,就是一个我们的小括号,再写上一个箭头,诶什么箭头啊,减号大于号,这就是个箭头了,然后再写个花括号里面写逻辑就可以了。你只要这么写就可以了,所以拷贝拷贝以后你放到这里,那么这地方我就改一下,咱们叫打印干嘛呢?我写上它,诶我们叫线程执行,诶行了,同学们,我们现在就写完了,写完了以后我的题六咱们启动一下。
09:01
行,那我现在呢,运行一下你会发现没有问题啊,咱们这里打印肯定是行的,为什么呢?这就是一种特殊的方式,我根本就不用创建自己的线程类,我就直接传逻辑就可以了,你说这不很方便吗?老师,那如果我想再来个线程的简单啊,你拷贝一下,你拷贝以后你拿过来我写个T7。可不可以啊,可以啊,我这写个一,我这写个二,诶再写个七,你看看我现在去运行,你会发现这两个线程它照样可以运行,你看看非常的方便,非常简单,对不对,所以啊,这是我们的一种方式,除了这种方式以外,其实我们构建线程对象的时候,还可以传另外一种方式,所以拷贝。拷贝以后呢,把前面的咱们全注掉啊,咱们全注掉,咱们构建线程对象时可以传递来可以传递。实现了啊,咱们叫实现了一个叫runableable啊,咱们的run ableable啊,接口的一个什么我们类的对象啥意思啊,同学们很简单,那我们写上它,咱们写上叫thread,诶好我们的thread,然后T7T8啊等于new我们的thread OK,写完以后咱们按快捷键叫CTRLP啊点一下。
10:16
点完了以后,大家会发现这个就叫runable对吧?什么意思啊,一个接口,只要咱们的类实现了这个接口,诶我就可以把它传进来,老师,那我现在该怎么做呢?跟大家讲非常简单,我们这里采用匿名类就可以了,我们说一下一般使用我们的匿名类。匿名类咱们之前讲过了吧,什么意思,就是直接写上一个new,然后把这个接口的名称我们写上就可以,对不对,它会自动帮咱们把代码补全啊好,代码补全以后,你在这个地方你直接写上它,我们叫线程执行也可以,诶这种方式也是没问题的。啊,同学们记住这是一种特殊的方式啊,给大家讲一下,诶老师,那我试一试吧,我们T8点我们的start好了,我们现在运行,运行以后你会发现跟刚才完全一样啊,它也能够执行,所以啊,咱们构建线程有很多种方式,你需要自己根据情况来选择,那比方说我需要自己的一个专门的线程类,那你就要考虑到这个线程类当中有哪些特殊的一些什么属性啊,行为之类的,那你说老师呀,我没有什么特殊行为,就是想执行逻辑,那我恰恰呢,可以选择不同的方式,比方说用这种方式,或者说我们用我们的下面这种方式都行啊。
我来说两句