00:00
好,这个呢清楚以后,那接下来呢,我们就看一下如何通过代码呢来实现,下边呢就提到了两个结构啊,第一个呢叫exor service,第二呢叫exors,那要想使用这个多线呃线程池,我们呢需要用这样的两个结构,这是一个接口啊,这呢是一个算是叫工具类了啊,那我们就开始写个代码,在咱们这个JAVA2下去新建一个,诶不妨呢,我这就做诶的一个铺。哎,我们把这个也看作叫创建线程的方式啊四。这个四呢,就是叫使用线程池啊这样的这个方式乘,那这块呢,我们看下该怎么去实现,这呢整一个嗯,May方法好A方法里边首先呢,咱们要用的呢,叫exor exs。Executors用它,哎它呢去点这是一个工具类啊,这个工具类的话呢,点有很多的精态方法,像这个呢,呃,New catch的啊,这个th pool你有,呃,Catch th po这有参数的,New有fixed th pool,只有创建你确定个数量的这个线程数。
01:14
啊,其他的这块呢,是带缓存的,还有呢,呃,提前有一些这个诶这叫叫安排的是吧?呃,这个呢,就是我们可以保证它在给定的延迟后去运行等等,这就有具体的一些,呃,有一些什么特殊需求的时候啊,那么没有特殊需求的话呢,我们就可以创建一个可以重用的固定显程数的一个线程池啊这就属于一个比较普通的一个方法了啊,我们就点啊去new一个叫fix的啊thread po啊这呢,比如我们造一个数量叫十啊,然后在这个位置呢,我们al enter一下,给它生成一个啊返回值,返回的这个类型就是ex service。嗯,注意这是一个接口啊。它这个接口,那你返回的肯定这是不是算是一种多态的形式了,哎,它肯定返回的接口有没有对象是接口实现类的一个对象了啊,这就是一个service,那拿到这个service以后,哎,我们呢,拿着这个service点它呢有两个典型的方法,第一个呢叫做submit来提交,还有一个呢叫做ecute,哎,Ecute这叫执行这个ecute的话呢,你会发现它的参数呢,只能是一个randomable。
02:30
哎,那是个reable re reable呢,咱们也提过,它叫重写run方法,Run方法呢也没有什么返回值,所以你会发现这个方法呢也没有返回值。哎,这是一个它啊,咱们先呃先写一下这个service呢,咱们刚才说还有一个呢,叫submit submit这块的话呢,比较典型的,咱们如果你是使用咱们刚讲的这个column的方式,哎,造的这个多线程的话呢,哎这个呢是可以有这个further啊,咱们那会不是提到那个further task吗。
03:02
哎,你可以再去接着获取它的那个靠方法的返回值。啊,就是这个撒密的这个方法呢,哎,我们在这标识一下啊,它呢适合,呃,这个使用于哎这个Co啊,哎使用这个Co,而我们这CU呢,它呢,哎适合。诶,适用于咱们的randomable啊,那这时候呢,我们要执行,就是我现在比如说要呃创建一个线程,我想干什么事,这个时候呢,我们这儿呢,只是给你造了一个线程数,你要干什么事儿,是不是还得你自己指定啊,你自己指定你想干什么对吧?哎,那自己指定需要干什么呢?咱们这时候呢,哎,还得需要你去写一个class,那比如说咱们还写个简单的一个number thad。你看这个呢,我们用一下。
04:01
Re。哎,在这呢,咱们还是简单的去变了一下100以内的偶数。哎,加加。这个我加上这个100啊,加上这个等号了,然后if,如果I取模二就等于零。哎,我们就做一个输出,好,这呢是咱们这个线程你要做的事儿,哎,注意咱们刚才说的啊,我这呢是造了一个线程池,里边有十个线程,但是你这个线程你要干什么,这我不知道啊,所以呢,我们还是需要去提供一个实现reable的一个,呃,实现类啊,实验类,然后这块呢,我们excute这块呢,刚才看到参数了,Ctrl out斜杠需要呢,把这个random传进来,哎,那你就需要在这个位置呢,我直接我写到这也行啊,咱们直接去new一个,哎,我叫number thread。斜杠。哎,这么着,哎,我直接呢去new一个run number thread,言外之意呢,就是诶我呢是想干这个事儿,你这个对象给我了,我是不是自然也知道你里边这个run了。
05:11
哎,那这个时候我们去excu下边这个我就注释掉了啊,哎,我调了CU呢,这样的方式呢,其实就帮我们去执行这个run了,好我们看一下。哎,你看这就出来了。嗯,那这块呢,我们也可以给他去加上一个当前线上的名字,哎,Thread点哎current thread.get一个name。那这么着,那这时候呢,我们看一下结果。哎,这个呢,叫这个池子里边的,哎,这个线程一。哎,是这样子的啊,那么这是咱们相当于是提供了一个来现场你要做什么事,那这个执行完以后呢,我们这个service呃还可以呢,去做一个叫shutdown。就是你这个线程池呢,最后不用了,你把这个线程池呢,可以关闭一下。
06:03
啊,可以做一个关闭操作啊,那如果说我还用还有呢,你这个线程是做这个事儿,另外一个线程做别的事儿,你是不是就可以再去造一个实现reable接口的一个实现类是吧,比如CTRLC一下,哎,这个呢,我叫NUMBER1吧,实现它,我这个呢是来输出这个基数的。哎,不等于它啊,只要NUMBER1了,然后呢,我这个位置再去。诶复制一份,这个呢,加个一呗。哎,那这呢,相当于是我们提供了两个,其实我们提供这个参数的目的呢,主要是你得告诉我这个线程到底想干什么啊,到底想干什么啊,然后我们再去执行。哎,这个呢,二是这个输出奇数的啊,一呢是输出偶数的,哎这样的方式就行啊,大家注意后边呢,我们需要去做这个杀当这个操作,哎这个操作呢,需要我们,哎关闭连接池。
07:00
哎,这样的一个操作,哎,所以说核心来讲的话呢,哎,我们是从这个角度出发呢,去写在上边啊,我们在这呢,写一下这个一吧,这相当于是第一步啊说呢,提供指定线程数的线程数量的。哎,线程池,哎,这个线程池呢,你可以理解为就是我们这个ex service啊,然后接下来呢,我们就可以去执行,哎,去。呃,相当于是执行啊,指定的这个线程的这个操作啊,此时呢,我们需要提供一个实现。来实现runable接口。呃,接口其实或啊或是这个Co接口,呃接口实现类的对象。啊,咱们这个方法呢,它只适用于这个实现randomno接口的这个submit呢,这里边呢,你可以去传一个call接口的。
08:04
哎,这样写一下吧,哎这呢,咱们我就不演示这个column了啊,哎,你要call呢,这块传过来这个散密有返回值,你拿那个further task呢接收一下。Photo接收完以后呢,这不你又可以去get了,获取那个方法的这个结果啊行这呢,就是咱们说的哎,这种方式。啊,这这个就相当于是咱们的这个第三步了。哎,关闭电机池。诶其实真正在开发当中呢,用的呢都是诶数据库,呃,都是使用的这个线程池,呃,因为呢,咱们刚才提到它的几个好处。嗯,好处呢,就是这里边儿的这三个。那CTRL一下。哎,第一个。哎,第二个好处,那么第三个好处呢,大家好像没有看到是吧,说我怎么去体现这个所谓的管理呢。
09:09
我格式啊。好,那么这不是咱们写到了说你可以去设置一些这个属性嘛,这个属性呢,比如说就设置这个盒的吃的这个大小啊,最大线程数啊,这都相当于一些属性了,那你怎么设置呢。啊,这时候你可能说,诶,那我通过这个啊,其实它这个工具类啊,啊这相当于是池子,有了池子以后,你才能够去设置,所以你拿着它去点呢,是不现实的啊也别试了,肯定没有啊那怎么办呢?你在这个执行之前啊,咱们在这呢去做一些这个设置。来设置咱们这个线程池的一些属性,那这时候设置哪呢,你拿这个service service啊第二。
10:00
你看看有没有直接去掉这个属性的。貌似没有啊,没有的话呢,你点个set呢,也没有方法,诶说明了,诶这没有这些属性了。这个主要原因呢,是因为咱们这儿呢是一个接口,这个接口呢,它的这个呃,属性比较少啊,因为接口里边你要有属性,是不是也是常量的,常量不就意味着改不了啊,那现在你想去设置这些属性,那肯定不在接口中了,那就得在接口的。实现类种嘛,对吧,包括呢,咱们刚才看到我返回来一个对象,我把它附给一个接口,你返回的这肯定不是接口对象,接口也没对象,那一定是接口实现类的对象,那它这个事件类到底是谁呢。哎,看不到是吧,其实有一个办法能看到,哎,我那叫service点有一个get class,诶get class呢,是咱们object当中的一个方法。哎,就是获取你这个对象到底是哪个类。
11:02
哪个类给你造的?啊,来,咱们跑一下。哎,上面呢,应该是出现过,哎在这儿出现了,哎这个对象呢,是这个类型的。哎,这个类型CTRLC一下,那这个类型ctrl shift t ctrl v放进去点开,诶它呢,继承了它,然后它呢,再点开它又实现了它这不就CU service吗。嗯,这不就找到关系了啊,相当于咱们返回的这个呢,你写成ex service了,其实我是不是可以给大家做一个强转了,哎,我就写成咱们这个类型的,哎,我还叫,嗯,换一个名行,我就还叫service吧,不行,SERVICE1吧。哎,看上面不能住,把它打开,上面这块呢,返回的是一个service,我呢实际上是可以考虑对它进行一个强转的,Out啊喷ER一下,我们给它cast一下。
12:02
实际上人家反馈这个对象呢,就是这个SERVICE1啊,这个呢,咱们就不要了,那么我拿到这个SERVICE1了,你看一下我们这个SERVICE1,我去点一下set一下大家看。是不是就有这样的一些属性的设置了。哎,因为类当中的属性是可以是变量,你在接口中你去给人家设置,那肯定设置不了,接口中呢,都是常量啊,所以呢,我们去设置这个呢,大家你可以诶比如设置这个是哎,比如说15啊等等,哎包括呢,还有下边这个service一点啊,去set一下叫keep啊alive就是它这个活跃的这个时间啊等等这样的一些参数啊,这个我就不在这去举例子了,诶通过这个呢,我们可以体现的就是这个第三个点叫做呃管理。啊叫管理啊行,那么这呢,就是咱们说的这个第四种方式叫使用线程池,嗯,这个第三种方式和第四种方式呢,嗯,对大家的要求呢,目前还不算太高啊,就大家的要写的话呢,这个继承和实现renoable这两个方式呢,作为最基本的先掌握。
13:13
啊,至于说以后我们开发当中用线程池呢,到时候具体问题再具体分析,很多时候呢,我们都是用一些框架来实现了,用不着大家亲自去写了。但是对大家要求就是你得知道创建多线程有四种方式啊,这里又提到一个面试题,哎,说创建多线程。哎,有几种方式,哎四种,哎这个要记住啊行,那我们这个呢,就讲完了啊,这个完了以后呢,整个我们这个,哎,整个我们这个多线程这一章呢,就结束了。
我来说两句