00:00
诶,接下来呢,咱们来讲怎么在我们的Java程序当中,咱们去创建一个线程,这个线程肯定是不同于咱们说的main方法对应的这个主线程的,首先咱们来看这个代码啊,这个代码我这写个类写了一个方法,两个方法,这个may方法,在main方法当中我们造了一个当前类的对象,然后呢,我通过这个S呢去调一个METHOD2。哎,传了一个hello mast2呢,又调一下METHODS1,那首先呢,确认一下这个呢,是不是一个多线程。就单纯光看它啊,不考虑后台那个垃圾回收的和那个异常的了,诶对,先明确他不是,哎有同学说,诶这不是我在执行这个main方法,我还执行METHODST2了,同时我还执行METHODT1了。哎,这个我说的叫同时是吧,哎,你要说是同时的话呢,这个是不是就不对啊,哎,对,我们是,你看你怎么判断是不是多线程,大家就看我们能不能拿一条线给它画出来,我们说一个线程呢,就是程序的一条执行路径,我要是能拿一条线给它画出来的,那就是一条路径。
01:12
那就是个单线程,你要是,诶后边呢,发现这一条路径呢,画不完了,哎,还有同时并行的另外一个线程,那才叫多线程啊,你看这个时候呢,咱们没方法进来,我造个对象调METHOD2就掉到这了,METHOD2呢又调到MA1了,实际上是一条线,是不是就可以勾出来啊对,所以这呢还是一个,呃,只针对于main方法来说,它还就只有这一个线程啊,所以这呢,首先明确它不是一个多线程。啊,那我们如何在Java程序当中去创建多线程这块呢?我们就提到了一个类啊,这个类呢就叫做thad,哎,这个类翻译过来其实就是现成的意思,就是我们要想创建多线程,必须要跟这个类呢打交道啊,那我们这呢,就需要看一下这个类,打开咱们的API。
02:03
嗯,API呢,这个位置大家去输入一下,这个叫thread成啊这呢就是我们这个ad了thread,然后呢,下边就是关于它的一些说明啊,比如说第一段说呢,一个thread,它是我们程序当中的一条执行中的线程。啊,一个thread你可以理解为呢,就是一个thread的一个对象啊,它就是对应我们程序当中的一个执行的一个线程,说Java虚拟机GM嘛,说允许一个应用程序有多个线程在执行,然后呢,Running啊这个叫并行的是吧,同时也就是说我们Java应用程序,Java虚拟允许咱们的Java应用程序呢,同时执行多个线程。言外之意就是咱们Java语言呢,是支持多线程的啊,这个意思下边说每一个线程都有一个优先级啊,高优先级的先执行啊,怎么怎么着,这个咱们关于优先级呢,就先不看了啊,这块也不看了,然后再往后走,哎,你看在这块啊,说ZR说有两种方式去创建一个执行中的线程,哎,这呢就相当于指明如何去创建多线程了,说one啊,其中一种方法声明一个。
03:21
啊,Surprise的这个类的子类,啊,生明一个类,让它作为我们read类的一个子类,那就是我们造个类去继承于它,说接着呢,这个子类呢,需要去重写SRA的这个类当中的run方法。啊,那我们就需要去重写一个方法啊,重写的话呢,你得遵循咱们说的重写的规则,然后接下来说呢,我们这个子类的一个实例啊,那你就是造个子类对象呗,啊就可以被分配啊,可start执行了啊,就是后边这块呢,说的有点,呃,这个稍微抽象一点啊,就是说的有点太快了,一下子就开始执行了,那怕你不清楚,后边还举这个例子,For example说一个线程啊,现在我用于计算说比指定的一个数大的这个质数都有哪些,哎,怎么写啊,下边举例子吧,哎,大家看一下,这不是首先呢造一个子类嘛。
04:14
啊,然后呢,去重写一下这个run方法啊,然后在接下来,接下来的话呢,你去造一个你这个子类的对象。这不这个词类对象吗?找完对象以后啊,去调一下,这个叫大的方法。这个star的方法,咱们在这个子类当中是不是没有重写过呀,也没有定义过,那你说这个start掉的谁的是最起码是从负类里边去找啊,诶对啊,这是大方法,它调的其实是我们这个thad里边的一个方法啊,那这呢,就是咱们这个启动或者要创建一个新的线程的一个方式啊,咱们把这种方式呢,咱们来描述一下啊,咱们在咱们的这个idea当中去写啊,那这是这个Java文件,咱们在这呢去写一个类啊,就叫做这个thread,哎,它的一个测试。
05:05
啊,在这个位置我们写一下啊,这叫多线程的创建,哎创建哎方式一,哎方式一呢,我们把它归结为呢,叫G乘于read类的方式,哎这样一个方式,好了,刚才呢,咱们看这个API的时候呢,其实他已经告诉我们这个这个创建方式的一个步骤了,啊大家回忆一下我们这种步骤呢,诶这个方式呢,有几步,第一步哎,我们需要呢,去创建一个继承于thread类的子类。哎,这是我们说的这个第一步,哎,那第二步是什么?哎,重写,嗯,重写我们这个thread类当中的run方法,这个我们在idea当中双击shift呢,它就嗯出来这个搜索了啊,所以我这个切换这个输入法,有时候一点多了,它就出来这个搜索了,重写thread类的,哎,Run方法,然后第三步呢,重写完了,哎接着呢,我们需要去创建。
06:28
哎,创建咱们这个thread类的此类的对象,哎,创建对象,然后第四步呢,呃,这个通过此对象去调用咱们,呃,这个thread类中的啊,或者直接说吧,就直接调用这个start的方法,哎这样的话呢,我们这个线程就执行起来了,好这呢是咱们说的这四步啊,那这四步写完以后呢,下边咱们就以一个例子啊来说明咱们这个线上的一个启动啊,这个例子呢,就是我们遍利一下100以内的所有的偶数,好做这个事儿成,那做这个事儿啊,咱们就按照这个步骤来,下面呢是一个测试了,嗯,这块呢,咱们就按照这个步骤,首先创建一个继承于S类的子类。
07:20
哎,那这块呢,我们就写一个哎class,哎,我这叫一个哎my thread吧,哎让他呢去寸,哎咱们的thread来这样行,诶这个我们生命了一个类,让他来去继承于咱们现有的这样的一个thread啊ctrl shift的F一下啊调下格式,然后接下来我们去重写一下这个run方法。哎,重写这个run方法,那run方法要重启的话呢,那咱们说过啊,你要么呢,你说是点开这个thread,是不是看一下人家这个run怎么声明的呀?啊,我这时候还可以去ctrl o一下啊,你写一个这个run,诶点一下。
08:06
哎,双击啊,这个RA呢,这样写的,那就是言外之意呢,我们可以整个L跟它一样啊,你可以CTRLC过来啊,把它呢粘到这啊,就是这样的去声明这是一种方式啊,还可以呢,更简单一些,直接我这写个run是吧,哎写个run呢,你看这块呢,自动给我提示出来了,我这个你就直接回车一下就行啊,他就直接呢进行一个重启了。啊,CTRLD把这个删一下,哎,这块呢,我们要重写这个run方法,那这个run方法呢,肯定你主要是写这个方法体了啊,那我们这呢要干什么呀。哎,那就看你这个线程要干什么了,所以这块呢,我们要明确一下这个重写方法,我们这个run方法重写呢,主要是针对这个方法体的,那方法体我们怎么写,那就是说我们将啊,你这个创建的这个线程要做的事儿啊,把你做的这个事儿,我们需要写在这个run方法当中啊,也就是说我们此线程啊,将此线程执行的这个操作,哎,声明在咱们的run方法中。
09:15
哎,咱们这个线程呢,是希望它变成100以内的偶数,所以你就把这个事儿呢,写到这里边就可以了,哎,然后这写一个for I啊回车啊啊,然后再回车,直接100这样啊,这就相当于用了一个模板了啊,然后呢,If啊,如果我们这个I呢,它取模二等等于零。啊,那就说明你是个偶数,我就把这个I呢输出一下啊,那我就这里边啊,怎么写默写一个这个P。这样不行是吧,那这样不行,那我就这样吧,这样写行吗?i.s out,好,这样的话呢,我们把这个I呢,就做了一个输出,这就是咱们这个线程想要做的这个事情,第二步呢就搞定了,然后第三步我们需要呢,创建呃,当前这个thread类此类的一个对象。
10:10
这个你要创建的话呢,这个事儿是不是需要在咱们的主线程当中去做呀,你这时候你这个线程啥也没有呢,你需要依赖于主线程去做,那我们需要在咱们这个测试类里边,诶,咱们写个这个may方法啊,May方法咱们这块不是已经改过这个模板了,所以我直接写个may啊就可以了,哎,在这里边我们去创建啊,你这个子类的一个对象。好,那这时候呢,我们就是哎直接哎在这我们去new一个啊叫MY,哎thread,哎这样啊封号一下,那这个时候呢,在这我CTRL1一下,你看这时候CTRL一出不来是吧,咱们原来在嗯ecl当中,我CTRL1它这块会提示去造个对象,这时候怎么办呢?Enter。哎,Enter这样就可以了,哎,我这叫一个T1吧。
11:02
哎,就是在咱们这个,呃,Idea当中,这个al enter用的相对多一些,你可以呢,理解成它一定程度上替换咱们原来在eclipse当中用的CTRL1。啊,CTRL1啊,像这就出来了,这是我们说的这个第三步,然后呢第四步,哎,我们呢,需要去调它的start方法。这样,哎,那我就直接T一点调一下start啊,回撤,哎,这时候我们按住CTRL键点一下start,哎,这不就在thad里啊,说明了咱们调的这个方法呢,就是thread当中的一个定义的方法,好这呢就写完了,呃,写完以后呢,这时候咱们执行一下看看啊,嗯,首先呢,我们去run。哎,你看这时候很快呢就出来了,哎从零哎这一直到我们这个100啊,100以内的偶数这个,我们把这个零呢,也给它涵盖在内了。嗯,这个时候呢,你发现它执行的就这,哎,我说呢,这时候咱们创建的其实就是一个呃,新的线程了,不同于我们这里边这个may。
12:07
啊,这个may方法这里边儿这呢是我们这个主线上做的事啊,或者这个时候你方便理解,我们这时候,比如我在写一个hello吧。哎,我这样一下,哎,这样一下,哎,这个时候呢,我们这样来理解这个过程啊,首先咱们先是有一个这个没方法啊,没方法一进来,这是我们的这个所谓的叫主线程啊,主线程一进来,一进来以后这造了个对象。那问你说这行代码,这是主线程做的还是分线程做的,谁谁做的,这个时候还是主线做的呀。这不是没没这个方法进来以后,这个造了一个对象,这个造了个对象,还是一个还是一个普通的对象,所以这个呢,还是咱们没方法对应的这个主线程做的哈,帮我们造了个对象,哎,而且呢,他还帮我们把这个线程呢给或者这个对象哈,调了一些start的方法,像这个造对象调这个start这块都是咱们这个主线上做的。
13:13
当我们调完这个start以后啊,后边你会发现它是不是执行这个操作了,哎,就是当你调完这个start以后,这时候相当于我们这个线程呢,哎,就开始要执行了,相当于咱们造的这个T1的这个线程,它是在咱们这个主线程当中造的啊。其实就相当于你这个题议,就相当于是一个小孩一样啊,这个小孩你想想你出生的时候,就是当你从这个母体当中出来了,这相当于你这个线程,你可以是理解成它是去运行了,那一开始你这个,呃,这个这个小孩是不是也得需要在这个母亲的这个肚子里边孕育出来是吧?哎,就相当于这个主线程一样啊,就是这个T对象呢,仍然是主线程帮我们造的啊,当你调这个start的方法的时候呢,它执行这个run,相当于这个时候T一开始独立的去执行了,哎,那么这块这个操作就相当于咱们这个run方法,Run方法啊去便利一下这个偶数啊,变成偶数,那么这时候我们这个主线程,如果你要是没有别的事儿呢,它就相当于是执行这个大括号就出去了,咱们刚才这不是加了一行代码嘛,哎,这上输出一个hello,那这个hello相当于是不是还是在咱们这个主线程当中做的,哎,对,那这时候你来看,就是在这个时间段之内,我们从这个角度去看啊,一个时间切片,这不是同时呢,就有这个主线程,也有我们造的这个分线程,这就相当于我们此时呢,有两个。
14:35
程在执行啊,那要有两个线程在执行,那你说这个hello,因为我们这呢输出了好多数哈,你说这个hello到底是在哪块输出呢?是不是就不确定了,哎就不确定,所以我们试着你看这时候执行一下,哎,这时候你找一下哈,哎哟开头出来了是吧。
15:01
又开头出来的啊,那这时候呢,相当于是我们这块呢,因为你调star的时候呢,它是不是再去执行这个,然后这个里边呢,再去做一个便利这块呢,我这个就一行,它很快就执行了,所以你会看的不明显了,那怎么办呢?咱们就不这样写了,我多写几个是吧,哎,我这也写一个便历呗。啊,CTRLCCTRLV便利,大不了我这让他输出奇数呗,一个输出偶数,一个输出奇数,这样行,或者说你说我这个也输出偶数,嗯,这这也可以,我在这个位置呢,加点东西啊,我加点这个星有星的,这不就相当于是我们的主线上。哎,这样子好,这时候我们再去执行,注意对于咱们的idea来讲,大家就不用每次写完以后去保存了啊,它这个自动就保存了,那直接呢你就跑就行,哎你看这时候这时候呢有点神奇是啊,还有一个是吧?啊,这要是这个都没有,都在这,那就有点太怪了哈,这是你发现这不就有一定的交互性了吗?这也算啊,再来他应该有变化没有啊嗯,就是大家呢,你去执行,你跟我执行这个效果呢,应该是不一样的,他这就成这样了是吧?啊这就跟你的电脑的CPU有关系了,就看它具体切换的这个频率了啊,跟这个有关系啊,就是这时候呢,我们知道实际上是有两个线程在同时的去执行啊,这就咱们说的这个创建多线程的第一种方式,哎,大家来了解一下这个事啊。
我来说两句