00:00
好了,那咱们就接着往下吧,第二个例子啊,咱们再往下干嘛呢?哎,我们说一下,在我们Java语言当中,我们实现线程有两种方式,各位啊,两种方式来这个线程来接着往下啊。直接写个五得了,Java语言中啊,Java言中实现线程有两种方式,其实不止是两种,还有还有第三种啊,还有第三种,第三种我们到最后的时候再讲啊,我们先讲前两种,时间线上有两种方式。哪两种方式呢?哎,第一种方式啊,编写一个类。直接继承Java language thread。啊,重写run方法,这是一种方式,各位。编写一个类,直接继承java.language thread,我们找找JDK文档,找这个Java浪包,找找这个浪包,浪包下有没有以T打头的thread,这就是那个thread。
01:04
这就是那个线程,各位,这个就是个线程类,所以你子类继承父类,你子类肯定是个线程类。那Java中的线程是这个Java支持多线程,并且呢,Java这块实现多线程也很简单。啊,就Java支持多线程机制,并且啊,并且Java已经将什么多线程实现了,我们只需要怎么着啊继承对吧,我们只需要继承就行了。啊,第一种方式编写一个类,直接继承它重写run方法,重写哪个方法呀,来我们看一下啊,看一下这个帮助文档中thread里边找找它有没有一个方法叫run,找找1R开始的run run run。跑是不是,哎,你看就这个方法。对吧,这就是第一方式啊,一种方式。那么我们一起来看一看这种方式,各位一起来看一下这个代码上怎么去实现,在这里我们去新建一个class class我们叫做什么呢?叫做TEST02。
02:11
行吧,哎,Thread t02各位啊,大家看,然后呢,接下来回车之后呢,我们写上去一个主方法,这里我们来看啊,实现线程的第一种方式,编写一个类。直接继承谁点language thread重写run方法啊,好,那来了,在这里呢,你可以单独写一个类。啊,写一个类,这个类呢,我们叫class,假如叫myriad去继承谁啊。I。明白吧,哎,去继承这个thread,然后在这里你需要去重写overwe,重写方法,重写哪个方法,Run方法OK。Run方法,你把这行代码给它去掉,去掉啊,重写run方法看见吗。
03:04
哎,这就是实现线程非常之简单啊,编写一个类,直接记成这个thread这个类重写run方法就行了,在这里啊,编写什么呀,编写程序对吧,这段程序。啊,运行在什么呀?啊,运行在分支线程中啊,或者叫分支站中啊分支站各位啊分支站那么这块呢,我们直接呢,在这儿写一个。For循环各位啊,For循环int I呢等于零,I小于什么呀?一一千吧,I干啥呀,加加。那在这里我们输出什么呢?输出这个线程分支线程,然后输一个箭头,然后加一个I值。好,我们就写这么一段代码啊,Run方法,那么接下来呢,我们最关键的问题是这样写,是这样写了,我们怎么创建线程对象,怎么启动线程对吧?哎,怎么创建线程对象,怎么启动线程呢?好,大家注意看了啊,在这里呢,这是一个main方法是吧?这里是main方法啊,这里的代码属于什么主线程啊,在主站中运行啊中运行各位,那么现在我们在这里可以怎么着啊?哎,新建一个分支线程对象怎么新建,那就是new呗,对吧?哎,那my thread my thread,一个my thread线程对象就有了,那么接下来我们启动线程。
04:49
那么启动线程调一个方法叫做。啊,这样就把线程给它启动起来了啊,那么接着如果往下继续走的话,这里的代码还是运行在什么呀?主线程中,比如说负二循环对吧?特类型I等于0I呢小于1000I呢,在这里干什么呀?加加,然后我们在这一块呢,哎,system.out输出叫做主线程输一个箭头加一个I值。
05:22
啊,这个就是启动线程,这是创建线程对象,怎么创建对象六就行了,怎么启动线程调用什么呀,线程对象的大的方法,各位啊,大的方法。注意啊,Star的方法,那么大家注意听啊,到关键时刻了,来扣一了,扣一了,在不在扣个一来,各位到关键时刻了,来扣一来。扣一了。可以啊,可以。关键时刻了啊,在打盹睡觉的,凡是玩游戏的你都给我停下来啊,都给我好好听一下这段啊,因为这个是很关键的啊,这个是很关键的,就这一段听懂就听懂了,听懂就废了啊就这个意思,来咱们来看一下啊,这个位置啊,有个star的方法,那么现在呢,我们啊给大家说一下啊,这个star的方法的作用是什么?
06:15
大的方法的作用是是在在JVM中。开辟一个新的占空间。啊哎,启动一个分支线程,启动一个分支线程,在JVM中开辟一个新的占空间,这一段代码瞬间就结束了。啊,注意这一段代码,这一段代码任务完成之后,任务完成之后,哎,瞬间就结束了啊,这段代码的任务只是为了开战空间啊,这段代码,这段代码的任务只是为了开,只是为了开启一个新的占空间,只要新的占,只要新的占空间开出来,此大的方法就结束了。
07:22
就结束了啊,大的方法就结束了,线程就启动成功了啊,线程就启动成功了。启动成功的线程会自动调用run方法,注意啊,叫做启动成功的线程会自动调用什么呀?哎,Run方法啊,Run方法,并且run方法在分支站的站底部。啊,这个是一个压占啊,压占run方法的地位和焖方法地位差不多啊,Run方法在分支占的占底部,闷方法占主占的占底部。
08:09
明白吧,Run和man是平级的,平级的啊,是平级的,各位。是平级的啊,他们不在同一个占空间当中,它这个方法很厉害,只要这个方法一执行,就会分配一个新的占空间,新的占空间一旦分配之后,哎,这行代码就结束了。啊。Run是必须要写的啊,Run是必须要写的,如果不写就废了啊,哎,不写就废了,注意这行代码瞬间就结束啊,注意听课这一行代码瞬间就结束,因为这行代码的执行任务是什么呀?是启动新的占空间。那只要现在占空间分配出来,分支站分出来,哎,我们这行代码任务就算结束了,然后程序就继续继续再往下走了啊,那么现在我问大家一个问题,如果是直接调用这个MY这个对象的方法和我们用有什么区别?
09:06
思考一下,思考一下啊,就是直接调用run方法,直接调用这个线程对象的run方法和我们调大的方法的区别是什么。如果你调run方法的话,不会启动线程对吧。是不是这个不会启动线程啊。对吧,不会分配什么。新的什么分支战吧。对不对,这个是不是不会启动线程。这个不会分配新的分支站吧。如果是调转方法,是不是还是等于在同一个站当中啊。对吧。这行代码不结束,下边这个程序是永远都执行不了,因为在同一个站当中吗?所以这行代码它执行不结束,下边代码是不是永远都执行不了?这里的代码要想执行必须等待run方法执行结束吧,所以你运行的结果你会看到什么呀?
10:11
来。往上走,大家看这个分支站是不是一直执行分支,分支你看分支线程什么输出分支线程,其实根本就没有线程。对吧,说谎撒谎呢,对不对,根本就不是什么分支线程,往下走往下走往下走往下走,你看啊,这个分支这一块是不是输入到九九九九百九十九之后,往下是不是就是才轮到这儿啊,是不是才轮到这这块啊。对吧,诶兰芳说的非常棒啊,不能并发,就是现在是不能并发的,对吧,你是单线程的这种方式就是个单线程。单线场。嗯。单线程啊。注意这种方式就是单线程啊,就是单线程。在分支线上乱方法必须写吗?刚才我说了呀,必须写。
11:02
必须写啊,来,我再说一遍,必须写。啊,必须写来,那么这一块呢,咱们画两个内存图出来,好,我再问大家一个问题啊,我我这样我再问大家一个问题啊,大家思考一下。我问大家个问题,如果换成这一行代码的话,是不是是不是这行代码不结束,下边就不能执行。我这句话说的对不对?各位。各位。错不对不对不对。不是不对。我的天呐,不对啊,好吧啊,我就呵呵了啊,我呵呵,Java中只有一个语法,听清楚了啊,Java中只有一个语法,程序必须得是从上往下依次逐行执行,这是亘古不变的道理。
12:00
明白吧,第20行代码不结束,第22行代码永远都不会执行,放心,这个结论是对的。只不过你的20行代码是瞬间就结束了。听懂了吗?我刚才说那句话是对的。这行代码不结束,下面代码是不会执行的啊,听清楚了,这一行代码它不结束,下面这行代码是永远不会执行,只不过这行代码它。马上就结束,瞬间就结束,因为他的任务是什么,是启动分支站。听懂了吗?只要分支站启动成功了,第20行代码就执行结束了,然后紧接着就把它执行20行代码了,就有一个道理是永远是不会变的,各位方法体当中的程序永远都是支持,都是什么呀,自上而下的顺序依次逐行执行,永远都是亘古不变的原理啊。我再说一下,对呀,我又给你挖坑,然后你又跳进去了。就是你还是不注意听。
13:00
还是不注意听,我觉得你还是没有注意听,你要真正说注意听了,我告诉你这个不可能就是跳进去啊,我给你挖坑,你往里面跳,这行代码不结束,下面代码是不会执行的,各位啊,就是这样,这行代码你不结束,下面就是不能执行,但只不过这行代码瞬间就结束,因为它这个任务是什么呀,是只是把占空间开出来。只是把空间分配出来。他把空间分配出来,这个任务就完成了,这个代码就执行结束了。啊,所以呢,大家要注意啊,有一个亘古不变的道理啊,亘古不变的道理是什么?这个原理是永远不会变的,就是方法体当中的代码永远都是遵循自上而下的顺序,以此逐行执行的啊来这块的话咱们注意一下啊,注意。叫做亘古不变。的道理啊,方法体当中的代码永远都是自上而下,自上而下的顺序依次逐行执行的,这个道理永远都不变。
14:06
啊,你把这个放开对吧,是你这个代码不结束,我这个代码是不会执行的,如果我把这个放开,同样也是这个道理,这行代码执行不结束,下面代码是不会执行的。这行代码必须结束了,这行代码才能执行,只不过这行代码结束的很快,因为这行代码的任务是开辟占空间,只要把占空间开出来,这个任务我说了就已经完成了。啊,这样的话就是这个线程就能启动完了,然后这行代码结束之后,主线程继续往下执行,这个时候分支线程也在执行啊,分支线程也在执行,听懂了吧?哎,但是如果你这行代码和这行代码要对比的话,对不起,您采用这种方式的话就代表什么呀,就代表只是一个普通方法调用,而且采用这种方式的话,它不只是调这个方法,它还会在内存空间上多一个分支线程,多一个分支站。
15:05
啊,那两个for循环是在同一时间执行的吗?那两个for循环是啥意思?是啊。那这个方循环和这个方循环由你启动线程,你如果启动线程大的方法只要一启动对吧,那你就管不住了呀。对吧,那你接着往下,哎,这个执行结束,接着往下for循环执行啊,这个线程启动之后,这个里边for也会执行这个for循环,执行for循环的,这个for循环执行组建的for循环根本就在两个不同的占空间中啊。对吧,并发嘛,并发吗?并发你懂吗?并发你懂吗?哎,你好好想想这个并发啊,这两个内存图我可以给大家画一下,如果是这个run方法,它的内存结构图应该是怎样的,如果是纳的方法,它的内存图应该是怎样的,我觉得这个呢,大家得好好的想一想啊,好好想一想啊。
我来说两句