00:00
好,那接下来呢,我们要写这个代码,首先第一步呢,我们得写一个线程池的一个工具类,对吧,在这边啊。摔了破幺九。啊,搞个线程池的工具类啊,当然线程池的一个创建呢,倒是比较简单啊,但是工具类呢,我们把它写成一个。想把它做成一个单利。啊,做成一个单立的一个公应类好吧,好好,那咱们这样写怎么怎么来呢。这样。首先呢,我们声明一个变量对吧,就是线程池的一个变量。哎,他呢,是属于这个包下。啊,你一直大家可能听过这个两个东西叫G和GC。呃,JA外,我们大家都知道Java虚拟机对吧,然后GUC呢,其实是一个包啊,是一个包Java u.con是Java里面这个并发包。
01:04
对吧,所以你多线程啊,线程锁啊,这些东西都是这个包下的。OK了,好那。呃,我们来这么一个。变量啊,先说明一个变量。可以吧,那接下来呢,我们既然要做这个。单利。所以呢,我们私有化构造方法,或者让我们先把构造方法写一下,Out加in色的对吧,构造方法好,那不选,反正都私有化了,那不选对吧,不选,然后呢。Private私有化它的一个构造方法,更重要的是呢,我们写一个函数,诶那就获取这个,那写一个方法来返回值是它对吧?好,Public static。好,范围类型呢,好。Get。他呗,我们就叫这个名字得了啊,他呢也有空餐就行了,呃,之后呢,这边我们最终呢,肯定是返回。
02:01
他。哎,好,这个地方忘了写这个。Static。得进它,要不然这里边调用不到,所以刚才写没用I一直返回这个this对吧?啊,那最终呢,肯定是返回它,那如果说我们不考虑这个什么单立不单立,那就比较简单了,直接。去溜一个。这个对象就好了,对吧,至于你的参数我们先不用管啊,我们先搞定这个单利的一个问题啊,参数呢,到时候我们会聊。啊,参数呢,到时候我们会聊OK了,现在你不用管那个参数,呃,那我们直接这样写一下。对吧,这个其实跟单利没什么关系,你每一次调这个方法呢,它都会去创建一个对象,对吧,所以呢,我们要写一个单例,那首先呢,呃,我们要解决这个问题。对吧,那我们先判断if这个东西,它如果等等于那。
03:05
那我再去创建,否则呢,我就不创建了啊,但是呢,这种看上去是一个单例没毛病对吧,但是他有什么问题啊这种。这种它有没有问题啊。我们想着它是一个单例啊,对吧,因为第一次。是不是维纳进来创建了,好你后面都不维纳了,你就直接返回了,那不是单利嘛,对吧,对它有这个线程安全问题对吧,实际上这种方式我们把它称为叫什么方式啊。懒汉式还是饿汉式?还记得吗?这个是懒汉式还是饿汉式?
04:09
啊,这懒汉就是,呃,并不先创建对吧,用到的时候呢,再去这个。创建啊,用到的时候再去创建对吧,好,那么我们如果想解决他的一个问题,那得怎么办,我们得加个锁对吧。我们知道当年这个类啊。好。诶,把他的放那个。锁里边创建,但是这个还是不行,对吧,我们得做成一个双重校验的,也就是说呢,在里边。我们还得。来一个。校验。对吧,做一个双重校验的,诶,那比如说你有这个多线程,那我也不怕了。
05:04
啊,我也不怕了,为什么呢?首先假如说你AB2个线程同时到达。啊,第一次啊,那当然AB2个线程呢都能进来,进来之后呢,因为我里边加锁了。好,我里面加锁了,那么你只有A能进去,对吧,A先到嘛,A进去,A进去出去以后B才能进去啊,我里面呢,又写了一个判断。啊,因为A出去以后。B再进行判断的时候,它就怎么样。它就不等于钠了,对吧?啊,所以双重校验的一个方式,这样呢,既保证了一个。限制安全又保证了效率对吧?啊,又保证了效率啊,你不能说直接在这外面加个锁啊,然后进来判断,这个呢,确实可以保证现在安全,如果只写这么多啊,我圈住的这么多,当然可以保证现在安全问题,但是呢,效率没办法保证,因为你这个我如果第一次创建完了,你后续呢,你再来多病度都无所谓啊,不等于闹了对吧,关键问题在于。
06:05
如果你直接这样写。那所有的数据都会经过这个锁对吧,这就不好了,所以双重校验啊,好,那这个呢,咱们就搞定了,这个倒还好,对吧,就是你有一个对象,那接下来我们看这个参数啊。一看还挺多啊,还挺多,那我们点进去看啊,点进来。首先呢,第一个啊,它叫process。啊,第二个呢,叫max process,诶一个叫核心池子数量,池子大小对吧,一个呢叫最大的这个池子大小,诶那这是什么意思啊,这个两个参数都是。池子里边的线程数,也就是相当于这个东西呢,我把它叫做一个常住线程。对吧,我把它叫做一个常数线程,而这一边呢,是最大的一个。现场。哎,就是你说你你假如说查出五个,这是20个,诶你发现五个不够用了,对吧,不够用了我就会创建啊,但是呢,我不能无限的去创建啊,对吧,我最多创建20个,如果20个还不够用,那没办法了,你只能外面数据等着了。
07:09
你只能外面数据就等着了,对吧,啊没办法呀,我没了呀,那怎么办对吧,这最大的这两个参数比较好理解吧,就跟我们之前写那个德鲁伊的连接池里边参数一样的,对吧,它也有常驻的一个。连接还有呢,最大连接数对吧?这两个概念一样的,好,那接下来这是一组概念,叫keep a lifetime,一个unit,这是数字,这是单位,诶结合起来十秒对吧,十分钟。哎,是这样子,一个数字一个单位啊,这个单位呢,时间单位,这什么意思呢?比如说我现在不够了,不够之后呢,这个是五对吧,我呢扩容到了20个现场。接下来呢,我发现我数据量很小。我数据量又变小了。对吧,没有那么多数据量的20个呢,就有点。
08:00
浪费对吧,你一直维持20个,其实可能三个就够了。三现在这个数据量呢,三个线程就够了,对吧,但你一直维持20个原点浪费那。对吧,这个就是说,诶,那你呢。如果说你空闲了这么久了,那么就会被销毁掉。啊叫keep a lifetime对吧,保持活着这个时间啊,要就要被这个消毁掉,过时掉啊是这个意思,好,那么接下来还有一个叫work q。工作队列啊,这个工作队列什么呢?去看啊看这就行。Before they are executed,他们被执行之前,执行之前干什么事呢?队列is used for holding task就是维持这个任务。对吧,也就是说你任务来了呢,先放到我队列里边,然后再被执行对吧?哎,保持一个队列嘛,这个也比较好理解,对吧,叫work q walk q OK吧啊这是现值当中的一个功能队列啊,到时候呢,你你任务来了,你先往这放,放之后呢,你便利这里边的,因为我这是什么队列嘛。
09:11
先进先出对吧,你先来谁呢?先去拿这个现场走。啊,一个一个走对吧,这种这个参数啊好,那一般呢,我们这个呢,可以给一个,比如说这边给一个A,这个没有开这个。小姐们啊。这边呢,是。20,然后呢,这个时间上。那。你就看你高峰期能持续多久,对吧,比如说我给个100秒啊。Time unit。
10:01
啊100秒对吧,最后一个呢,你有一个叫。啊,来给他一个工作队列对吧?好,那主要最核心的是他啊,这个参数该怎么去给,大家可能会问对吧?啊,我就说一下,就是说那我生产环境当中这个参数应该怎么给呢?现在倒无所谓,对吧,你给三四或者给二给一啊,给一就没必要了啊,你就得很显得一个,那么肯定至少得这个二吧,对吧,你得有这个两,至少有两个线场啊,你看一个的话,那你们有提升嘛,对吧?嗯,那我给一个四五对吧,或者十啊都可以,那生态环境当中咱们应该怎么给呢?是这样子的,比如说。比如说现在呢,我们的。访问啊,假如说我数据都是,那我们就考虑这个一毫秒。啊,那正常来说呢,我们一秒钟就能够处理这个1000条数据吧,啊,1000条数据啊呃,假如说呢,我现在是1万。我现在呢,高峰期的速度是1万。
11:01
啊,是1万条每秒。然后呢,我想做压测对吧,我要搞个2万条每秒啊,就扩容扩容两倍对吧,好压测按照这个标准来啊,注意听啊,现在呢,我的。我的一个变异度呢是1000,我卡布拉的分区呢是四个。我卡不卡的分区是四个,那我问大家,这你最好设置为几比较合适?你设置为几比较好啊这个线程。嗯。注意啊,我按一毫秒对吧处理,然后呢,我一秒钟能处理1000条吧,一秒钟一个冰度能处理1000条,但是我卡不卡呢,四个分区,我呢现在想测能达到2万每秒,没有这个。
12:13
延迟没有,不会出现这个。设置为多少比较合适?对,就是五。啊,就是五,你可以设置个五或者六。对吧,啊,你可以设置个五或者六好,那这是不是就明白这个数字到底怎么去取了呀。对吧,其实他就是想。扩扩容几倍对吧,啊,扩容几倍啊,那你看我呢,刚才说了四个分区。对吧,那我们对应的是不是应该用四个边度,那一个边度呢,每秒钟处理1000条。1000条,那四个冰冻呢,每秒钟现在呢能处理4000条,但是我现在要每秒钟处理什么2万,那怎么办呢?那就给五给600。五六对吧,这个数字呢,你不是说我们给大家一个值对吧,你得根据你生产环境当中这个东西呢,来推算一下,能明白吗。
13:08
对吧,我给个五或者六,因为毕竟考虑它是线程嘛,它不是真正的变度对吧,所以呢,我们可能考虑给个六算出来呢,加一个。啊,我加一个,因为你如果是20个冰路。那肯定没有问题,因为一个冰度一般我们到时候说这个,呃。参数的时候会聊啊,他呢一个变行度,我们会让他有一个CPU一个核啊,而现在呢,我们是一个变度里边开多个线程,那这个总资源不变对吧,只是线程数偏高了,所以你五个刚刚好,那一般呢六个七个都行,对吧,比你算出来这个值呢略高一点,但如果你是冰度,那就不用,那就直接这个值就好了,能明白。这个意思吗?能不能明白?
14:01
对吧,就是这个五怎么来的。对吧,或者说一般这个关于这个线程,我们可以略微的给高一点点,对吧?啊给高一点点啊,因为毕竟线程不是进程,它呢,呃,同一个冰路里边的线程,它会有资源争抢,所以呢,它的效率你虽然是四个,但是呢,它可能。比四倍要。稍微差一点点。对吧,稍微要差一点点,是这个意思啊好,那这个是我们构建这个线程池的工具类啊,构建线程池的工具类啊,好,那么接下来呢,就到写我们这个异步函数了,因为线程池有了,然后呢,我们之前德鲁伊的这个菲en尼斯连接也已经有了,对吧?这两核心的有了就够了啊,那接下来呢,在方程里边我们创建一个啊叫。ASYNCE步的DM啊,或者说我们把DM放前面吧,呃,为表的ANC的一个方式。对吧,好。
15:01
它呢,首先我们刚才看到要继承这个叫。Ay c的一个方程对吧?好,那么这里面呢。它有两个参数。啊,它有两个参数,哎,好像下不下来啊呃,下不下来没关系啊,那我们看一下。啊。这是盖了不对,这个导错导错包了啊。呃,咱们得用什么,得用这个。Java的啊,不能用skyla的啊,那我们点进来啊,我就说之前下过skyla的那个可能没下下来啊,但是呢,Java这个下过下过下下来了啊来看这里面有两个参数啊,它有两个范,一个是in,一个是out,对吧?呃,这个是输入数据元素类型,这是输出数据元素类型,好,那我们这边应该写什么,大家告诉我。我们输入数据应该找谁呀?咱们的输入数据应该找谁啊?
16:19
啊,这个输入有没有同学告诉我它应该是什么类型啊。他是不是应该是我们这个流的数据类型有没有问题。对吧,因为对于我们当前这个函数的输入,这个函数是要作用到流上的,那它必然是这个流里边的数据类型,对吧,就是我们之前写的这个招聘吧,这个有没有问题啊。输入数据是它这个类型,大家有没有问题。能理解吧,好,那关于这个输出数据呢。
17:02
输出数据呢?对了,是不是也是它呀。对吧,因为你要想我们这个异步IO函数要干什么事儿,不就是在这个里边,每一条数据来了,我要去查询。为表,然后呢把这个字段补充上,因为现在呢字段都会弄。对,要补充信息输出,所以呢,输出结果还是他好,呃,那我再问大家,这个东西这样写好不好呢。这个函数对吧,我们这样写这样不好啊,为什么呢?因为你看啊,我们当前这个需求要关联维表吧,那这个下单,这个省份力度下单要不要呢?要对吧?好,那还有一个这个品牌品类用户力度退单要不要呢?要比如说我们还有需求叫什么支付,假如说因为我们没有涉及那么多需求,其实都可以对吧,我再看一下各个。
18:20
维度下的支付需求是不是也可以啊?对吧,我再看一下这个支付需求当然也可以,对吧,那你看如果十十一都要去关联为表,那我的招聘肯定跟这个不一样。我的招聘肯定跟你这个东西呢,它不一样。啊,那怎么办?所以我如果这样写死是不是不太合适啊,因为我这样写死的话,碰到其他的需求,咱们只能再写这个函数,对吧?所以呢,既然我们封装的这个函数写出去了,那我们就想着他能不能够通用一点呢,对吧?像这种东西,因为我们很明显感觉到后面肯定要用。
19:03
对吧,如果像那种之前我们写了一个就没考虑,你比如说谁呢。像这个函数对吧,Table方式我们就没考虑后续要用,因为这个需求就太特殊了。对吧,就这一个啊,他不会再有了,所以呢,我们就没有考虑啊,但是这个你得考虑啊,因为你不光这个需求管理位表,你还有其他的,所以这个地方咱们要还真得写谁啊。要要要写谁不能写这个具体类型吧,我们还是写谁写T。还是写T对吧,就不要这个类型了啊啊要给个T对啊,就要给个T啊,因为我们类型。不确定啊,对吧,不确定啊,那这个报错啊,这个飘红看见没,因为你在当前这个类上面。要给个T,哎,它就变成了这个,呃,蓝绿色对吧,啊蓝绿色就不报错了,这个底下报错是因为。集成了一个抽象类,它有方法要实现对吧,奥加回车啊实现这个方法,然后呢,呃,这两个呢,我们都去写一下啊,必须要实现的它啊,这是一个抽象方法,而这个东西呢,倒不是必须要实现的,一般来说呢,我们都实现一下,这就我们给大家说的这个time out的方法,看见没?
20:17
啊,这个叫timeout方法,看见了吧,对吧,就是我们超时,但是它里边没有给的啊,啊那既然你是作为一个rich,那我们先把准备工作做一下,就open对吧?诶open要做一下,首先呢,呃,那我们由。两个东西,一个呢是德鲁伊的连接池,一个呢是线程池,对吧,这两个东西呢,我们要去构建一下啊呃,连接池。倒一点。得到一个。Data source,当然这个东西呢,你不能写在这里边,写在这里边不行,对吧,呃,咱们呢要private,诶把它写出去。你可以给个那值对吧,好,那还有一个呢,那这个就不要了,这个生品就不能要了,对吧?好,那还有一个呢,是咱们的线程值。
21:05
对吧,现在尺啊,那就是。12、悠久店。诶得到这个线程值,那同理我们把这个东西呢也给它。挪出去。啊,当然这个这个是。属性的声明我就不要这个了啊啊,那这个声明给他干掉啊,你不能要这个声明了,那这样的话呢,咱们至少把这个我们目前所需要的内容是不是都给了对吧?呃,一个。连接池构建了一个呢,是线程池啊,在一个并路里边呢,像这些东西我们只要有一个就够了,因为这个线程池里边会对应有多个。这个连接池对应多个分连接对吧,它对应多个线程,而且在我们这个工具类里边啊。还有一个工具类,呃,DMU对吧,这个里边呢,咱们这个这个。连接也用的是一个连接池,所以呢,我们可以保证有连接可用。
22:05
对吧,啊,有连接可用,诶这个就比较合适了,对吧,所以呢,我们今这样来写,这是我们的一个准备。工作啊,咱们要准备工作,那最后怎么调用呢,这一块啊,咱们就肯定不这样调用了,对吧,把这个呢要干掉来。干掉对吧,好这边关联怎么关联叫a sync的点on的。Wait对吧,这个我们说过了,硫由呢是我们的trade的user po DS,然后我们的这个呢,是DMAS的一个方式,对吧,而在这叫trade,因为里面写的泛型嘛,对吧,你在这要给一下啊这第二个参数,那么第三个它要的是一个超时时间看到。啊,长时间这个地方呢,就是说你这个。函数。我给你多久,因为你毕竟是异步L对吧,因为你这条数据没有结果,也不影响我后续输出,我用的A的,所以你这条数据到底有没有结果,你得给我一个准信,就多长时间你就不考虑这个了,对吧,好那。
23:12
这个东西到底给多少呢,你就要看你当前这个查询它最大的时间是多少,我这样告诉大家啊。呃,查询里边我们不是访问了,访问了这个。Penix嘛,是不是对吧,我告诉你这个phoix呢,它在访问连接时间查时间比较久,它呢是60秒一分钟。啊,就是在我们访问Phoenix连接ZK那一步。啊,连接ZK那一步啊,那咱们呢,是一分钟的超时时间,有一分钟的超时时间,好,那我问大家这个时间,这外面这个超时间,我是要大于这个一分钟的,还是要小于一分钟的,大家告诉我是一。
24:05
还是?二。是大于还是小于啊?啊,我告诉你ZK的连接超时时间。啊,是一分钟,那么我们应该在这设置的值是大于。一分钟还是小于呢?诶,说一说二的都有。对吧,有一有二的,一是大于一分钟啊,二是小于一分钟对吧。到底应该是大于一分钟还是小于一分钟的啊,大家说一说二的有,那我就解释一下啊,那我们就先写一个小于的对吧,比如说这边呢,我给个30秒。
25:02
比如说我给个30秒啊,它会不会有问题呢?它会有问题啊,其实答案应该是大于这个一分钟啊,你假如给个30秒,它会出现什么问题啊,那有没有可能我在里边访问这个菲hoenix的时候,我ZK呢连了45分45秒。我连CK连了45秒,终于呢,连上了。对吧,我呢,连上了,连上了以后呢,但是不好意思,你在30秒的时候判定我超时了,你里边。想要到45秒连上也不可能,你在30秒的时候,我就怕你超时了,不让你连了,主动给你干掉了,对吧,那肯定不对,你起码哎,就像牛总所说对吧,起码得保证ZK就内部得处理完。才可以。对吧,啊,你得优先保证这个超时间啊,那我们呢,就给个100秒吧,比如说啊对吧,然后呢,看unit.second OK吧,诶咱们这样的方式好CTRL加V得到一个这个呢,咱们叫trade use PU with。
26:07
谁呢,SKU?DS,因为我们呢,这个是关联SKU表对吧,去补充我们想要的这些个信息啊,所以呢,咱们这个叫VSKUDS,那这个流程咱们就梳理完了对吧,但是呢,这个函数还没写啊,还没写直着把架子搭起来了啊,那这边写的呢不要错,那未来呢,我们就不用map方,而是用这个。If。对吧,而是要用到这个。OK吧,啊这样的一个方式啊好,那这个呢,我们就。
我来说两句