00:00
各位同学大家好,刚才呢,给大家讲到了线程时底层的工作流程,包括它四种拒绝策略,那咱们下面继续往下完成,那下面给各位来说什么呢?大家考虑一个问题啊,刚才咱们讲到了,我们说了三种线程池,一个叫一池N线程。一个叫一池一线程,还有一个叫做一池可扩容线程,那大家想一下,你说在实际的开发中,咱们会用哪种方式建线程池,是一直A线程,一是一线程还是一池可扩容线程?你想一下实际中你说用哪种方式创建?给大家说明啊,很多同学可能觉得啊,我们是不是用第三种方式,一时可扩容方式,当然给各位说明,咱们在实际的开发中,这三种方式中哪种都不用就全都不用。
01:00
而咱们用什么呢?咱们一般都是自定义一个线程词进行实现,就是我们自己写个类,然后让这个类呢,New这个th po里边传入七个参数,实际中咱们一般都是自己进行创建,那为什么自己创建的,我这里边有这么一段话,咱们来看一下啊,这里也写到这段话呢,是阿里巴巴的Java开发手册,这里写的很明确,实际中咱们不允许用E创建,而是通过这个po方式自定义显生池,为什么这么做呢?因为这里写到。就是我们不管是用这些方式中创新线声尺,它有一个特点,它允许请求队列中的最大长度是这么大,引t.mask value是不是很大呀?这时候可能会造成你的堆,堆积大量的请求,造成我们的OM这么一个异常,所以实际中三种方式咱们都不用,因为它可能会造成ome,会造成大量请求的堆积,咱们实际中一般都是自定义线程池完成咱们的操作。
02:10
这各位也知道是阿里巴巴的一个约定,而咱目前也遵循这个约定来完成线程池的操作,那下面呢,我们就自己来创建一个线程池,让大家感受一下咱们最终这个特点到底是怎么样的,下面我们就来写一下。那咱们来看一下啊。比如说现在我在这里边呢,我再来创建一个类,这个类我起个名字就叫做threat这个DEMO2。然后在这里边呢,咱们来做件事情,就做一个自定义线程池的这么一个创建,那下面我们来具体写一下这个代码。里边呢,我们首先先写个问方法。然后在里边咱们用自定义线程池的方式,咱们直接new上一个对象,叫这个th po。
03:08
Is cut。这么一个对象,然后在这里边呢,我们传入刚才咱们说的那个七个参数,那下面咱们来传一下,或者说咱们通过对照它的源码,我们来一个一个把七个参数给它就传进去,首先大家看第一个参数。这什么是不是它那个常驻线程,那比如说咱第一个值就来一个二,按照咱们刚才图上的示例,就是咱们这张图上这个示例常驻线程是二,然后这里边还有第二个参数,我们看一下啊,第二个参数是什么呢?是不是这个。最大的线程数量,那咱就是五,然后第三个是什么呢?咱们看到这个东西,就是它那个存活的这个时间,包括下面是一个单位。那咱写一下啊,存货时间,比如我们是这个二。
04:02
然后它的单位我们用一个time union,点上这个方法,咱就来这么一个叫做。Second秒,让它是两秒,这是我们的第三个,第四个,然后除了这两之外,咱们继续往下看,看下一个参数是不是这个blocking q,一个叫阻塞对立,那阻塞队列中咱就new上一个组合队列,之前咱们用过这个a RA blocking,包括其他方式,那我们写一个a ray blocking q里边加上阻塞对立的长度,咱就来一个三,这是我们的这个参数。然后除了这个之外,下面还有一个就是里边的这个参数来看,这个啊叫做threat factory是一个线程工厂,而线程工厂咱们直接用一个默认就可以了,这个eecs里边这个方法我们看到啊,它的方法这个default threat factory是一个默认的建成工厂,然后除了这个之外,还有最后一个参数。
05:07
这个参数。这是什么?就是里边那个拒绝的策略,那我们来写一下啊,拒绝策略咱就直接扭上这么一个对象,里边有它的拒绝策略。上一个叫thread。泡。Inor,然后你看这里边啊,有多种拒绝策略,就是咱刚才提到的,比如说抛异常调整模式。丢弃这个队列中等待最久的,然后不做任何处理,那我们就写一个解绝策略,所以现在咱就把里面的七个参数都减进去了,最终返回对象就咱说那个,然后换一个啊,叫这个exeor service,跟我们之前一样。Inor service,所以这样的话,咱们就完成了这个线程池的这么一个创建,这就是一个自定义僵持的过程,然后这里边我们就传了七个参数包,常驻线程数量、最大线程数量,存活时间队列,包括线程工厂,还有里面这个就是拒绝策略。
06:15
这个完成了,完成之后下面呢,我们也做个测试,比如现在咱们同样。处理十个请求,看他这个过程,我把这个代码就直接复制了啊,因为咱们刚才刚写过。处理这个。是个请求,这个过程咱都说过了,比如现在我执行挨个C的时候,然后它里面会创建显池中的线程,然后在里边按照这个线程在里边做相应的处理,现在这就是关于一个自定义线程池代码的实现,那我现在把它执行一下,咱们看一下最终的效果是怎么样的。我们来执行。然后大家看这里边就是不同的这个线程处理了不同的业务。
07:02
啊,比如说我们多执行几次啊,里边应该是不同的处理方式,因为这是我们自定义创建出的过程啊,当然过程中如果超过的话,是不是会抛出一个异常,就是我们只用那个拒绝策略。所以现在啊,这个关于线程池的部分给各位就最终演示完成了,在这个过程中呢,最终重复一遍啊,要求各位同学掌握正极点,第一个加池的特点跟连接池是一样的,就是提高咱们线程的复用性啊,包括等等相关特点,然后第二个使用方式,咱们创建了一池N线程,一池一线程,一池可扩容,包括第三个他们的底层原理都是创建这个threat po it q,另外在这个对象中有七个参数,七个参数的含义,各位同学要牢牢记住,以及还有一个更重点部分,它的底层原理,四种拒绝策略。
08:03
也就是这张图上的过程,各位比给他必须要能够牢牢说明白,给他牢牢记住。除了这个之外,还有最后一个内容,各位同学要学会如何自定义一个线程池,包括咱们这个代码该最终怎么去实现。所以现在咱就把这个线程池的部分给它,就最终完成了,这是关于我们讲的这么一个重要的知识点。
我来说两句