00:00
那么接下来呢,咱们看这个叫做线程池,对吧?线程池,那么我们先把这个类型给它建出来,嗯,叫test thread to线程词,那么在讲线程词以前呢,我们首先得理解理解,我们说为什么要用这个线程词,对吧?为什么要用线程值呢?那么咱们就先简单的举个例子,我们说原来我们说用线程的话,我们是怎么用的呀,对吧?我们说搞的这个什么单right DEMO,然后让他去implement,是不randomable接口啊,然后在这这里边呢,实现wrong方法,我可能在这里是不是做一些事情啊,对吧,我们比如说就来个in等于零吧,然后呢,就简单一点,就打印100以内的数小于等于100,然后什么s out,什么thad.current thad点是不是该并啊,然后拼上一个冒号,拼上I的值是不是这个意思,A加加的值是不是A加加的值啊,我们的传统。
01:00
填在这个以前,我们用现成的是怎么用的呢?我们说当我们需要现成的时候,我们是不是用一个对吧?我们说创建一个这个的实例,然后呃,TBB怎么用一个slide是不是创建它的实例啊,我们说当我们需要这个线程的时候,我们是不是就new一个呀,然后去启动对吧?说再需要呢,我们说我们再拗一个对吧,然后是不是就去启动啊,说每次应用的时候,我不是得重新全新的用一个线程,创建一个线程,然后给它分配一个任务,是不是启动啊,说当这个线程用完了以后,那是不立马又得把它销毁掉,就立马又得把它销毁掉啊。因此我们得到结论是说什么呢?说每次我用到一个线程,不管我这个任务大小对吧,用到这个线程,我都得分配一个全新,或者创建一个全新的线程,然后启动,然后呢,用完了以后呢,这个线程呢,就被立马的被我们销毁掉,因为。
02:00
因此我们说你这样频繁的,或者说你的任务如果过多,你去繁的创建和销毁县程的话,那么他是不是也非常的耗费资源,那么也就是说线程时的这个例子就跟以前咱们学的个什么很像呢?哎,数度共连接时大家学过吧,对吧?我们说当时讲数据库的连接时,我们说为什么要有数据库连接时,我们说我们现在我们说我们的应用程序是不是要连远程的这个数据库啊,应用程序要连远程的数据库对吧?那我说每次我当我需要访问数据库中的数据的时候呢,我就得远程建立一个连接,用完之后把这个连接是不是立马删掉了呀,是吧?当下次再用的时候,我又建立一个连接,用完之后又立马释放掉了,那我说这样的频繁的建入连接是不是影响性能啊,于是我们说我们的解决办法就是当时讲数据库的时候,是就在这里搞一个数据库连接池,在这里先准备几个连接,让他与这个数据库是不是保持着连通。
03:00
状态呀,用到的时候我是不是只需要在这个池中取连接,用完之后放回到磁中去了,那也就意味着每个连接是不是都得到了重复的利用,并且每一次不是你用的时候,你就去新建,用完了就销毁吧,对吧,你只要取现成的即可。现在线程池的这个道理跟这个是一模一样的,原来我们不用线程池,我每次用线程我就得重新创建一个,用完之后我就把这个线程利器的销毁掉,这样如果说我们的任务过多,你频繁的去创建和销毁线程,它是非常耗费资源的,于是我们说那就得有现场吃,对吧?举个简单的一个例子,是不大家都明白了呀,比如说咱们班长王世杰,他一到这个放假的时候,你们是不是就找着了,对吧?他在休息的时候呢,他是很忙的,他通常忙的时候去哪呢。
04:00
但是这是你们说的,不是我说的吧,对吧,就民那块有个叫叫养生这个这块个二楼有个什么养生,你们知道吗?是不是不呀,对吧,叫做这个好像是叫,呃,反正就是跟大保健有关的,对吧,比如说做这个养生按摩什么的,是这么说吧,那那我们说呢,比如说那个王世杰肯定是那里的惩客是吧,然后说每到放假的时候呢,他就去,就每周去的时候呢,比如说对吧,那个如果这个店不够专业的话,说每次当他去的时候呢,人家都会给他重新找一个师傅来是吧,就每次他去,去完之后呢,都会现给他招一个师傅来,然后是不是为他提供服务啊,对吧,然后三秒钟过后是不是就完事了,你们没想歪吧,问一想就是三秒钟以后就完事了,完事了以后,人家那个电视就把这个又给他辞。
05:00
掉了呀,对吧,然后这个时候呢,说王世杰是不是又去了呀,又去了之后,人家电是不是又得重新给他招一个对吧,三秒钟以后是不是又辞掉,那么每你们别笑了,再笑我就讲不下去了,那就是每次这样频繁的去新招人,那你说他麻不麻烦对吧,王世杰他本身他自己体验是不是也差,对不对啊,你们没抢歪吧,对吧,那我说那人家正规的或者个专业的店都是什么样的呢?是不是先给来准备十个对吧,是不是先先给他准备十个计知对吧?然后呢,说当他去的时候,王志杰是不是只需要从这十个里头选一个空闲状态的是不就可以了,对吧,对吧,然后呢,结束了之后呢,再再让。
06:00
人家处于空闲状态,对吧?那这样的话,你是不是就不用频繁的去新招或者是销毁啊,对吧?行了,就是数出来就是这个意思,现程时是不是就跟这个一模一样,我说的都是完全正规的,你们不要想歪,听明白吧,好了,对吧,我这个是要录视频发网上去的,应该不会听别人网友听了也不会想歪,对吧?那就可以,那可好了,那那那这就是线程池的道理,因此接下来我们是不是就开始准备现程池啊,对吧?我们说我们要是有大量的线程,你要不用现程池,那是不是非常的耗废资源呢,对吧?所以说接下来呢,我们就得用线程池,所以说这种方式呢,我们就不用了,嗯,那我们说线程值要怎么个用法呢?我们说实际上呢,线程池它底层就维护着一个线程队列,实上线程池它提供了一个线程队列,那么队列中呢?
07:00
啊,队列中存储的或者保存着一个一系列等待,或者所有所有等待状态的线程,是不是都等着执行任务啊,你只要线程都处于等待状态,你只要给它分配任务,它是不是就立马就能执行了,所以说他你维护了一个线程队列,线程中保存着所有等待状态的线程,因此有了这种方式呢,它就避免了去对吧,叫做创建,创建语音销毁线程对吧?创建于销毁线程的一些额外开销,就额外的性能开销啊,因此它是不是就提高了什么呀?叫做响应的速度,是不是就提高了响应的速度啊,那这就是我们用线程池的目的对吧?那我们说线程池它都在哪呢?我们把API打开对吧?或者在这里找。嗯,在这个包这找就可以了,一盒。
08:01
看看性名词数也是在这个1.5以后提供的这个zva.uQ点看看呀,在这是在这里啊,你点开以后和线程池的一个核心接口呢,叫做ex cut听到吗?那这个就是线程池的一个核心接口,它是维护线程的使用和调度的根接口,听见吧,对吧,我们把它列下来啊,实际上线程池这里头有一些这个子接口啊,它有一些时间内呢,稍微的有一点点乱,咱们过来捋一下就好了,那第二个我们说线程池的一个体系结构,线程池的体系结构所一个什么情况呢?首先刚才咱们看了它们是不是都在张方点UQ点con方中呢,对吧,有一个叫做EE啊,是不是这样一个线程值啊,对吧?它主要负责什么呢?负责线程的使用与调度的跟。
09:02
根接口对吧?它主要是负责线程的使用和调调度,调度的根接口和调度的根接口,那么下边呢,它是不是也有几个常用的子接口啊,对吧,一个叫做exe啊,叫做service对吧?这个呢,它实际上说白了就是线程值是吧?这个呢,是一个叫做是不是子接口啊对吧?它主要就是线程池的叫做主要接口,负责线程主要接口知道吧,它是负责线程池的主要接口,那下边它有个什么呢?那就是你既然是线口,你要用线程池,你能用接口吗?那里用啥呀?是不是找它的实现类啊对吧,也就是叫做th to ex对吧,对吧,E CE Co对吧?那这个是不是叫做,说白了它就是实现类啊,实线类说白了它是不是就是线程池线。
10:02
值的实现类吧,对吧,我们说通常找应线程值接口是不能用的,是不是得用用它实线类啊,对吧,那这个就是实线类,相应的呢,它还有一个说ex executiveutor,它service,它还有一个子接口,子接口叫什么呢?叫做schedule sh,呃,E duled对吧,E这个名字都比较长,对吧,叫做e service,它是不是还有个子接口啊子接口子接口这个子接口是负责什么呢?叫做负责线程的调度的,用于线程调度的一个子接口,那对吧,这这这同次关系是不是还能看得懂啊对吧?那么相应的呢,它呢,还有一个叫做实线类,叫做schedule的,呃,叫做th pool吧,TH的pool对吧,一个SCO对吧,Cut。
11:02
O啊,这个也是实线类,这名字是不是有点长啊,这个呢,也是实线类对吧?那么我注意一听,这个实线类是什么呢?什么情况呢?它有点特别,它是它继承了th pool sector对吧?相应的它实现了schedule exact service对吧,它又继承了是不是关于线程池的实间类啊对吧,需线程池的实间类,同时是不是又实现了负责线程调动的这个接口啊,那你猜一猜它具备什么功能,它是不是又具备线程值的功能,又能做线程的调度对吧?所以它首先它是继承了,继承了这个叫做th po ex sectorer对吧,同时呢,又实现了这个叫做schedule po exactly这么个道理啊,对吧,这是他么的啊这个接口对吧?是不实现了这个接口啊对吧?那这。
12:02
是它们的一个主要结构,也就是我们统称要用的,那么这个时候实际上呢,我们最终实际上最根本用的核心关注点是不是它,对吧?其他的这几个包括线程值以及用于线程调度的,实际上是不是都是属于它的实现类,也但是呢,我们说它是不是包含了所有啊,我们关最关心的是它吧,对吧?那么当然它是一个接口,接口是不能创建实例,那我们要用的话,是不是得用它呀,对吧,那我说这是就是说白了就是一个多肽对吧,那我说要创建呢,得创建它的实力,以及创建它的实力吧,对吧,但是注意我们创建这个叫做比如说创建线程池啊,创建线程调度的线程池啊,这个操作呢,不用我们做,我们可以看看API,比如说except service,它下边呢,是不是有一个实现类叫做slide po,这是不是就生成实实现类点进去,咱们关键看哪呢。
13:01
咱们就看这一段就可以了,他说什么意思啊,他说无论如何这个程序员都间歇使用,叫做更加方便的ex excuse斯工厂方法数据创建线程池,同学呢,你无论如何说得提供有更方便的这个工厂方法去做获得线程时啊,对吧,比如说有这个exist用catchw pool,它叫做这是这做无限线程时吧,就没有限制的线程时是不这个大小随片啊对吧,无限线程时下面再看这个叫做new fix s,这个叫做固定大小的线程池吧,还有个new single这个这个叫做是不单独的线程池,所以人该根据我们提供的工厂方法呀,他是不是给我们提供了这么一个工具类,对吧?最近我们是不是已经发现很多类似于这项工具类呀,说考研就分有。
14:01
对应的con丝数组有对应的瑞丝,File有对应的file丝是吧?这这都是给你提供具体这个一些实现的工具方法,对吧,我们拿过来用即可,对吧,那将来呢,还是得往下读一读,以前咱们说讲数据库连接词的时候,我们说连接词你是不是给他配置啊,那你看再看他,他怎么说的说呀,说这个这个这个这个叫预先构,预先构造的设置是吧,说人家的预先设置适用于公共的情景吧,是不这意思啊,对吧,就是说它一天的设定已经可以适用于大部分的情景,是这意思吧,也就是说我们是不是就不需要再配置了,他的他已经他已经给我们提前配置好了,应用于大部分的情景,如果说那说那有极其特殊的情况吧,这个说如果有例外的话,那要使用下边的这个啊,指导是使用下边的这个指导啊,啊,如果说有更有例外的话,你要。
15:01
使用下边的这些指导再进行配置,但是通常情况下我们是不用自己配了,对吧,是拿过来用就可以了呀,对吧?那么过来呢,咱们再总结一下,我们说实际上三一个叫做工具类,叫做EXACT4,对吧,那么这个工具类它是干嘛的呢?它是不是给我们提供可以获取连接值的呀,刚才我们看到了一个叫做new叫做fix的TH负,它的作用是创建固定大小的,是不是连接值啊连接池,呃连接池了,线程值是不固定大小的呀,对吧?我们说那它返回值是什么东西呢?注意看啊,我们再看返回值,点进去看一眼都是啥。是不是都是这个先程词的跟接口啊,对吧?返回的是不是都是这个东西对吧?那这是一个,那么下面呢,还有这个叫做new,叫做catch的TH负这个叫做是不是叫缓存,缓存线程时啊,它的线程时的数量是不是不固定对吧?线程时的数量是不固定的,它有一个什么特点呢?可以根据需求自动的更改数量,它根据你的需求自动的去更改数量,那么相应呢,还有一个叫什么来着,是不是叫single对吧,叫做thread吧,Thread的它这个名呢,还有点不一样,ESE是这个东西啊对吧?它反就是创建一个单个的线程池,是不是里边这个线程池中只有一个线程对吧?就给你准备一个线程,共给时中说线程池中。
16:47
线程值中只有一个线程,那么注意上面三个是不是都是单独的线程池啊,那也是不是它还得有,有的时候我们说这些线程我们是不还想调度啊,对吧?它又给我们提供了一个叫做new schedule do to,对吧?那这个它有什么作用呢?它也是创建固定大小的线程池,我们刚才说了,说这个东西它不仅有线程池吧,还还能干啥呀,是不是还能对线程调度啊,对吧?还可以叫做延时或者是定时的去执行任务,那这就是他们的一个区别,那有了这个我们是不是线程值拿出来就用就可以了呀,那以后我们是不是就直接面对线程池中的线程即可呀,啊过来就可以用,那么首先过来第一步我是先得有一个线程池呀,对吧,叫做创建一个线程池线。
17:47
整值,那么是不是通过except对吧?Co tos是不是根具类啊,其中有个方法当成new,比如说叫做fix斯,是不是创建固定大小的线程池,比如说我先准备五个线程吧,它给我返回的是exact s service,这是不是线程值啊接口对吧?比如说这就是不说shift o导向轴,那么这样的话我们这个线程池就创建好。
18:16
对吧?线程池创建好了,人家给我们准备了五个线程,是不是供我们使用了,那接下来我们是不是就用就可以了呀,对吧?比如说我启动十个线程对吧,分配分配给我们的线程池中是不是准备的这个线程的,说分配给线程时中准备的线程任务是不给咱们分配任务,对吧?那就第二步叫做为线程时段中的线程分配任务,为线程池中的线程分配任务,怎么分配呢?你通过pull,这是不是十啊,它有个方法叫做submit me是不是提交啊,给现在时提交任务啊,它是不是有方式啊,有run有colorable的吧,你是不是随便,我现在是不是刚才写了一个叫做runable,那我们就来这个可以吧,对吧,然后呢,你只需要我这个任务是不是有了,是不都我是不是创建好了呀,我只需要把这个任务TPP给他是不是就完事了,这样的话就给我们的线程之中准备的线程提供。
19:16
什么任务,但是大家注意,第三步十用完了,你得怎么是不关闭连接这个线程池啊,是不得关闭线程时啊,对吧,通过叫做破点上三道,注意这是不是有个三道有一个沙灯道啊,它俩也是有区别,这个三道它是以一种平和的方式去关闭线程池,就是说它会关闭线程池,但是呢,它在关闭的时候呢,它会等待,等待县城池中所有的任务都完成了以后,他再关闭,听懂了,然后与此同时呢,来新的资源,他就不再接收新资源了,是不就等待现有任务关闭,等待现有任务执行完了之后关闭即可呀,再来新任务他也不接了。
20:04
明白意思吗?那这叫杀道,那你们猜这杀道那有啥意思,哎,你立即关闭啊,不管你池中的那些线程完没完事,是不是就都关闭对吧?那通常我们说习惯用上面这个呀,对吧?扫档就可以了,那注意现在是不是只有一个线程啊,把一个任务分配给了线程,池中呢,某一个线程我们先右键运行一下,看看效果,注意看是不是就一个线程打印100的数吧,是这意思说池中11中的一线程吧,对吧?那这样的话看不出效果,我们是不是搞分配给他十个任务啊对吧,对吧,分配给他十个任务是不是来个提交任务可以了,分别是提交了14啊对吧?那这次再去右键运行,注意看效果啊,这叫11了,是不是现成11号啊,然后里边的THREE15THREE4323451是不是一共有五个,是不是值中准。
21:04
为了五个线程供我们去使用啊对吧,池中准备了五个线程就供我们去使用,那它现在池的好处就是你避免了额外的创建和销毁的开销,也提高了响应速度,这步骤是不是也挺简单的呀,那么接下来再来,刚才咱们看到了它不仅能接收是不是numberable啊,是不是还能用colorable对吧?那么接下来呢,咱们把这一段呢注掉,是不是搞一段colorable的呀,对吧,我放下边没问题吧,对吧,大家看着就行了,那搞一个colorable那也是一样的,叫做pro点是叫submit呀,就来个color啊,那我们就给他一个colorable,我们匿new play的方式没问题吧,来个in danger,然后小括号呃,大括号呃,小括号,然后打括号啊对吧?然后是不是给他分配任务啊,同时你是不是得实现呃,导包,然后实现里边的抽烟方法呀,你在这里完成任务是不是就可以了呀,比如说我来个还是把来个印。
22:04
T塔sum等于零是不是计算的和来个负循环,然后呢,来个100,然后萨姆加等A,然后呢,Color中的区别是不是在于它有访问值啊对吧?有访问结果,那结果访问谁呢?注意find me,它还得到一个future对吧?注意只是咱们之前说了future是future task的是不是副接口啊对吧?副接口那叫样来个photo control shift o导一下包,那这就是我把这一个Co包的任务分配给了其中的一个射程吧,现在是不是也只有一个任务啊对吧?那我是不是可不可以多来几个,或者说或者先先来这个一个来一个一个来一个一个来,你说我们说康有没有结果啊,我future是不是就能接受结果呀,我就future点啊,是不叫get呀,对吧?当然它的方法有异常,我说把异常先抛。
23:04
一下啊,大家看的清楚点,那么现在呢,只有一个,咱们就先演示一个再说,最后不要忘了懂么是关池啊对吧,破点啥到搞那么右键啊,结果什么都没打印是吧?那结果我打印一下可以吧先对吧,结果先打印一下,右键运行是不是4950啊对吧,对吧,再加个100是不是就5050,首先说这个结果是不是有了对吧,右键运行是不是结果有了呀,对吧,那现在呢,我们是不是多开几个,并且给它加点名字啥的,对吧?首先我来个放循环呢,还是执行宇恒,这能说还是执行14啊对吧,分配十个任务。这能搞定了你十个任务以后,你是不是也有十个结果,你十个结果怎么处理呢?比如说我搞个集合里头存,哎是不是存这个future啊,Future里边是不是啊啊,例如new一个release control shift o找一下包,然后这里来个叫做list.at把这个是不是加进来啊。
24:21
呃,Future不能盖的是吧,我是把future加进来呀,对吧?好一个个的future是不是加到集合中去,然后等我这个词关闭了,杀放了以后,我是不是就可以遍利集合了,对吧?那就来个for对吧,便利我的集合在这里用future.get好定,那这个时候呢,有十个,十个呢都是这个任务,然后呢,就看5050是不是就完事了,右键。是不是十个记成十的结果呢?对吧?那这就是线程池与color的使用方式,这否定啊,对吧?就三步,第一步创建一个线程池,第二步为线程池中的线程做一个个的分配任务啊对吧?或者说为线程池中准备好的线程做分配任务,最后池用完了之后,适当以平和的方式把它关闭掉即可。
25:13
相较于原来的好处就在于你不用每次都去,哎,新建与销毁对吧,节省很多开销好了。那么这就县城时。
我来说两句