00:00
呃,那首先我把它拿一下,他得继承它对吧。写成它,我看一下我叫的是什么名字啊,我尽量跟那个统一叫d ma的一个方式好。那这里面我们写一个叫Di man的一个方式,对吧,叫维度啊异步查询。方式。好,呃,那么呢,它得继承我们的reach an的一个方程。做这个事情。呃,那这个呢,明显呢,它有这个分型,一个输入类型,一个输出类型,呃,那那他告诉我这个地方我们写什么。输入数据类型写什么?输出数据类型又写什么?大家能不能告诉我?
01:04
想一想,我们要用在哪儿?都是奥外的,哎,没有问题,应该都是那个外。啊,都是好。呃,那这个地方呢,就是对于我们当前这个需求来说没有问题啊好,那你要想啊,除了订单表,也就是说我们的维度啊,我们之前用的是这个用户啊,用的对吧。用的用户啊,那实际上除了这几个维度之外,是不是还有很多其他的维度,包括除了订单这个业务线以外,咱们是不是还有很多业务线,那各个业务线是不是都要关联维度,如果说我们这写的是out wide,那大家想再来一个业务线是不是又要写一套这个了,再来一个业务线是不是又要写一套,大家想有没有必要?
02:19
哎,大家都知道了,实际上我们这个地方呢,不能写all the white,我们得写什么,对对了,我们输入像这种关联维度的操作,是不是都是输入跟输出都一样啊,对吧,所以呢,我们就得写什么。T和T,但是这个地方直接报错了,那是因为当前我们类上面就跟方法上面一样的,对吧,这得要一个什么T。啊,有同学说要to啊,一般来说我们这个地方只是关联维度用的嘛,对吧,关联维度用的,所以说就直接写TT了,当然你写to也可以。写IO对吧,写I。
03:00
写IO对吧?呃,也可以啊,写IO2个不一样对吧?也行,输入数据跟输出数据不一样,当然这个是可以的啊,可以的,那如果说你写IO的话,这个地方你要写IO了对吧?Out加回车实现里边的方法,好,这里面有两个方法,一个是A方法,一步的方法,一个是开号的方法,对吧?超时,因为刚才我们在呃官方文档当中看到了,如果说我们在调用的时候是要传一个超时时间的,然后接下来这里边很明显要有一个。Open要有个open,那这个open方法里边,首先我们要做初始化谁啊。要初始化菲尼克斯的连接对不对?大家想一下对不对。是不是要初始化菲hoix连接?对吧,所以呢,我们private,然后呢,Connection,我们把我们知道的能写的先写一写啊对吧,然后这个连接我们还是一样的class for name这一幕。
04:04
con.feeling drive对吧,然后呢是connection。赋值drive manager。然后是g more con.phoenix。好,呃,那第二个问题,我们还要做什么事啊?我们是不是还要去?初始化一个线程池。对不对,我们是不是应该在这儿初始化一个线程值啊,大家这个一个并行度里边是不是用一个线程值就够了,对吧?好,那接下来呢,我们要写一个线程值啊,写一个线程值啊,那这个线程值应该怎么做呢?我们来写一下在这个工具类当中。
05:01
摔了破有。啊,其实这个所谓的线程池呢,很简单啊,很简单,就是一行代码搞定了public。Static。啊,那线程值对吧,返回值啊,那thread。啊,就叫他,我不知道大家之前有没有用过啊。好,呃,那接下来呢,我们就直接叫get。没有用过是吧。啊,那实际上这里边呢,只要去直接啊,假如说你要简单一点,你有一个。好,这里面呢,要几个参数。就搞定了,就这么一行代码啊,就这么一行代码就搞定了。
06:01
好,当然里边参数等会我们来解释啊,呃,那首先呢,这一块我希望把它做成一个,呃,双重校验的。懒汉式单例对吧,好,那第一我们是不是先。私有化构造器。对吧,然后双重校验的构造方法应该怎么写?首先我们要定义一个什么?在外面我们要定一个。对象了,对吧,假如说呢,叫这个名字。啊,最后在这个里边呢,我们应该返回的是谁啊,返回的肯定是他。啊,返回的肯定是他对吧,哎,这个地方应该是static。好。呃,双重校验的,首先呢,进来我们先写一个if,这个三负啊,这个地方呢,我们给它赋个值对吧,负个初始值啊,然后接下来呢,这边如果它能等于钠。
07:12
等等于接下来怎么办?接下来直接去溜一个吗?直接拿它等去赋值六一个。这个对吗?这个肯定不行吧,对吧,这个肯定是不行的啊,那为什么。这个地方为什么不行啊,因为很有可能,既然你要防止这个多验帧调用,对吧,所以呢,但是其实对于我们来说,我们不用做这个了,不用做双重校验了,但是一般写单立我们都写成那样子,因为很有可能AB2个线程同时进来,同时进来。
08:00
对,懒汉式线程不安全啊,两个人同时校验到第一次嘛,同时校验到他们呢,是不是就创建了两个对吧,它有两个了,所以在里边我们要加一个什么single。然后呢,我们用这个类啊,作为一个锁可以吧。我们也不搞那个对象了,点class好加一个锁,锁里边怎么做,锁里再做一次判断,If,这个th who ex excuse,它等于no,对吧,然后呢,我们再去干什么创建。这样是不是就好了?对吧,啊,写一个这个双重校验的这种单例。对吧,双重校验的这个单列啊,那这个呢,我们假如说叫。Private对吧,写一个这个双重校验的这个单列那就好了。对吧,那接下来呢,我们看这里边的参数啊,看这里边参数啊,呃,那我们直接点进去。
09:05
直接点进去,好,这里边呢,有这几个参数,叫core核心的尺子的数量,然后这个呢,叫max process最大的数量,对吧,然后keep alive time啊,然后加一个time u9,这里这两个呢是合体的,一个是给数字,一个是给单位,一个是给数字,一个是给单位,对吧,是这个意思,好最后还有一个叫blocking。Q啊,一个work q啊叫工作队列,那什么意思呢?我们来看,一个一个来看,首先第一个叫Co process,他说这个东西啊,是在池子当中所保存的。Thread的数量对吧,核心的啊呃,甚至在其他的东西被。这是什么?超时了,过期了啊,等会呢,我们下面会有这个东西来看啊,呃,接下来你先保留这这个呢,你注意一下池子当中现有的。
10:04
这个现成的数量,好,那接下来这个是最大的尺的数量啊,那这个比较好理解,对吧,假如说这个是四个,最终呢,我保留四个,这是十对吧,最多假如四个不够,我最多可以创建这个十个啊创建十个是这个意思对吧?好,那接下来还有。这个地方。叫这两个我们连起来看啊,连起来看。呃,那这是keep alive time,这是一个数字啊,这个呢是一个单位,假如说这是30,这个是秒。可以吧,30秒什么意思呢?比方说我现在呢,池子里边的这个线程不够了,现在你创建了四个对吧,核心的是四个,然后呢,这边规定是十个,好呃,我现在呢,数据量来了很多,四个不够,不够的话,它是不是会新创建线程,最多创建到十个。对吧,创建十个用着用着用着用了用了之后呢,发现诶接下来数据量越来越少了,甚至到了晚上对吧,没有数据量了,没有数据量了,那等了30秒,这个池子里边有线程都没有被使用,对吧,那它就会销毁一些。
11:14
啊,就会销毁一些,但是销毁多少呢?注意只会销毁六个,保留几个,保留四个,所以刚才我们看到即使这边已经超时了,但是呢,他他不会,他至少得保留四个,这个比较好理解吧。就是说当不够了,我们就创建,创建到最大值对吧,当这个线程现在没有人用了,那过了一定时间没有人用了,我一直维护那么多的一个线程也没必要嘛,对吧,我就销毁啊销毁呢,也保留剩下四个,这个能不能理解?这个没问题吧,对吧?好,那咱们还剩最后一个参数啊,还剩最后一个参数,最后一个参数呢,是这样子的,叫work q对吧?工作列,他说什么呢?他说这个队列啊,是用来干什么呢?For holding task,保留这个任务的before什么在他们被处理之前啊,呃,也就是说当我们这个任务来太多了,没有线程处理的时候,那我们就放在这个。
12:24
队列当中,我们就放在队列里边,因为现在应该被用了,对吧,我们就放在队列里边啊,这个要注意一下,好,这里边有一个点啊,容易搞错的一个点,一定要注意一下,大家觉得诶,假如说啊,这个是四,这个是十。我问一下大家啊,大家觉得是这里边儿有四个线程被占用了就往队列放,还是有十个被占用了往队列放?
13:05
大家觉得是哪个呀?好,那你们还说没写过这个,那还有一个问题,什么时候创建余下的六个呢?什么时候会创建余下的六个?大家知道吗?什么时候会去创建余下的六个?就是说我四个已经用完了,接下来又来一个请求,大家说的先往这放。队列里有的时候。
14:02
啊,有同学说队列满了,有同学说队列有的时候大家是怎么认为的?啊,其实这个时候我已经明白了,大家这个四是怎么来的,大家是这样想法,是不是好,先来了四条数据,一人呢,占用一个线程,接下来有数据先往这个队列当中放,队列当中再从队列当中取,取完之后升起这个线程,然后呢,直到十个。是吧,就是队列里面有的时候就立马是这种这种想法的吗。认为是向总的扣一,认为是池总的扣二。对吧,他俩说的不一样,一个人队列满了,一个人队列有数据就要去新创建。三是什么鬼啊?
15:04
把三的拖出去枪毙吧,好不好?三的有点过分了。这个地方呢,可以告诉大家是一啊,就一当这个队列满了,当这个队列满了才会去创建第五个,才开始去创建第五个。注意,当队列满了,才会去创建第五个。啊,这要注意一下啊,才会创建第五个啊,这个呢,我们可以写一个很简单的例子来做一个测试啊好,现在呢,我们把这个线程池先构建好,在这边呢,我们先写一下,比方说默认的我们就四个呗,对吧,我们这边就写一个四啊呃,然后呢,核心就是总的我们给他。20个吧,啊这边呢,我们也可以给大一点啊,假如说十个。十个线程,16,我们是,我是八和16线程是吧,八和16线程。
16:04
我想想看,我我给八个吧,给八个啊,给八个这个呢,给16啊随便啊,其实一般用不到这个,用不到这个,呃,那这边保存的一个时长对吧,假如说我们规定这个60秒啊,一分钟没有人用呢,我们就销毁啊,这个time u,那就是time u点啊。一分钟,那我们这样呗。我就写分钟这个写一可以吧啊,就反正单位组合你写60秒一分钟都可以啊呃,那最后一个要一个队列啊队列,那我们一般用这个link的blocking啊blocking啊就这个就行了。对吧,当然这个里边你也可以传这个参数啊,传这个参数,如果你没传没传默认的是int的最大值。对吧,当然你可以传一下,你可以自己传一个这个值队列的值,对吧,这样的方式啊好,那这个时候呢,我们给大家做一个测试啊,做个测试看一下是哪种呢?比方说我这写两个,我我做测试啊,我只是写两个啊,然后接下来呢,我给大家写一个测试,这边这个测试我给他看掉了。
17:13
呃,这个。破test。PM。好呃,那我们队列呢,是浪的最大值啊,不是in的最大值对吧,所以几乎不会到这个值啊,那我们来看这个地方是什么样子啊,我直接先在这边用一个叫thread po u9。所U就点get所对吧,得到我们一个线程池啊,然后接下来负I循环啊负I循环I呢小于这个十啊,比方说我们用十个线程,我们要起十个啊然后呢,虽然不点呃可以submit提交一个,当然也可以ex对吧,都行啊一个一个呢是执行一个是word,一个是那个两个都一样,没什么区别对吧?但反正我们不要这个防回值啊呃,然后这边呢,又有一个runable里面接口里边有一个run方法对吧?那这个地方呢,我们做一个打印啊so打印嗯,S硅谷。
18:14
或者说我们打印一下当前的现成的名称,对吧,Thread。点guide,呃,Current thread,点这个get name。加一下对吧,拼接一下这个爱。我们打印一下这个限量名称,好注意看啊,我现在尺子里边给的是核心的只有两个对吧?啊,那这个能测出来,如果说是池子满了才会去创建。才会去创建新的十字,注意这个地方满了才会去,队列满了才会创建新的,那是不是两个两个打印,两个两个打印,那如果说是第二种呢,假如说这个里边有的,就会创建新的16个,我只要十个打印十次肯定够了,对吧,很简单,这个呢做一个测试,然后接下来呢,在这里面我们可以th.sleep。
19:07
假如说睡个两秒钟。对吧,让他睡两秒钟啊。异常抛一下好好,那这边呢,运行来看啊,这个就能看到这个结果了。稍等一下啊,让他解析完成这个测完之后呢,我们就可以看啊,等两秒钟打印一次,看见没。等两秒钟打印一次,永远都是线程一跟线程二。没有更多的线程吧,看见没对吧?啊,其实它是要等什么呢?等这个池子满了啊,等池它不是池子错了,又又说池子等这个队列满了,才会去创建新的线程,直到最大值。
20:07
啊,这个要注意一下啊,这个容易错啊,容易理解错啊。好,这是我们所看到,那接下来呢,我们在这个里边。在我们的,嗯,那个类呢,我看一下叫跑哪去了。啊,这个,哎,不是它啊,是我们的reach DM啊这个啊,这个类里边我们是不是应该再去搞一个线程值啊,然后th to excuse对吧?哎,这个地方呢,我们把它也做一个初始化。这造成资源浪费。呃,什么意思?没懂。
21:01
如果等队列满了。16个只用两个不是这这压根其他14个压根就不会创建,知道吗。最核心的还是用这八个,这个16个压根另外八个不会创建。你没有满的时候就不会创建。如果等队列满了再创建连接,会不会来不及会定时条,不会啊,那你你过来之后,你你要往这里面放才会工作,你进不来。出去积压呀。数据积压呀,反压呀。这16个并不会都创建啊。头脑。这不是资源浪费啊,对吧,这要注意一下,你可以把它调高吗?你把它调低一点不就完了吗。对吧,这个值可以改,我不说了嘛,默认值是那个你可以改吗?你可以改的对不对,这个值你都可以改啊,你自己都可以改,是这个意思,他不是说创建16个只用八个,不是的,压根就不会创建另外八个,对吧,他只有满了才会创建第九个,才会创建第九,那我刚才测试不白测了嘛,那你看啊,这边他一直等两秒钟,等两秒钟。
22:15
对吧,它都一直用这两个,因为池子里面只有这两个线条,只有两个条,但你要改为四,它就一次打印四次,一次打印四次是这个意思啊好。这是我们所看到的一个d manc的一个初始化,对吧。
我来说两句