00:00
啊,那么讲完这个线程通信以后呢,咱们其实这一章的主要内容就结束了啊,最后这块我们补充了一个内容,这呢就涉及到我们在GP5.0当中新增的两种创建多线程的方式,这两种方式呢,咱们做一个了解啊,补充进来就可以了,那这里边呢,提到了第三种方式呢,叫实现这样的一个接口,或者你也可以念成叫call able是吧,这样一个接口,然后呢,第四种方式呢,叫使用线程池,这个呢,也是我们真正在开发当中选择的一种啊,使用线程的方式,OK。这呢我们做一个了解引入进来,首先呢看第三种叫啊啊这呢,如果我们看这个API的话呢,就明确能看到它是5.0新增的了,啊这呢咱们就直接呢看一个案例,通过这个案例呢,咱们说一下诶为什么这块要引入一个新的接口。你要说呢,原来我们是有一个thread继承的方式和继承的方式呢,有它的单继承的局限性,我们引入了一个叫reable或者叫runable是吧,可以使用接口的方式去实现,那已经有了接口的方式啊,为什么又引入一个接口呢?哎,这呢,我们看到这个呢,它这个确实比我们run a呢要好一点。
01:05
哎,主要呢,我们看看为什么说它好这呢,我就提前把这代码写好了,大家呢直接了解下就行,我们现在呢也想去,诶便利一下这个100以内的这个偶数。变列偶数的同时呢,我还想额外的做一个操作,那就计算一下100以内偶数的一个和。啊,你看这是我们怎么去处理的,这个时候呢,我们使用的这种叫Co这样的一个方式,首先呢,我让这样的一个类呢去实现了叫column。呃,实现以后这儿呢,它重启的这个方法呢,叫做靠方法。其实也很好理解啊,你看。那重写的叫run方法。啊,靠able重来就是靠方法。啊很好理解,然后这个靠方法呢,就相当于咱们原来的那个run方法了,那么大家你看一下这个方法的特别之处。首先你发现呢,它是不是可以有返回值类型啊。比咱run是不是就高级一点是吧,Ran是Y,你不能有返回值啊,那我们这个how的话呢,你可以有返回值,大不了你这块不需要的话,你可以return now是吧。
02:07
诶,当然呢,它这块就更灵活一些了,另外呢,还有一个点。对,你会发现呢,这个方法呢,它竟然可以呢,通过死肉的方式呢,去抛出异常了,就这异常呢,不一定非得要在里边去处理了,我们可以呢,继续往外抛,在外边呢去进行统一的处理更灵活了,那个run的话呢,我们就不行是吧?第一呢,在内部这块我们去拆开始,或者说呢,你内部要是不拆开时呢。哎,那你可以呢,诶其实也得check catch啊,只不过check catch,至于呢,你可以呢,在这个catch当中,其实这呢就涉及到更高级的这种处理的方案了,哎,就是这个意思哈,咱们现在呢,你比如说在这个run里边,这个sleep方法呢,它不是有一个异常吗?是吧。可能会出一个编译式异常,就这个了,所以我们在这里边呢,做这个开,其实呢,我们也可以怎么办呢,如果你外边呢,就想知道这个方法调用可能出现什么异常,诶大不了你也可以这样。这个位置的话呢,你就写一个肉。
03:02
哎,我去一个呢,叫runtime exception。然后在这里边儿,你大不了比如说把这个异常呢,作为一个字符串的方式给它传进去。看能理解不?啊,这个呢,就是我们实际开发当中,其实呢,使用异常呢,也比较灵活一些,就是说呢,你如果外边呢,就想知道这个方法出现什么异常了,然后呢也能抛,只不过这时候你抛一个运行时异常,运行时异常咱们不是通常都不处理了吗。所以就避开了这块写Rose了,但你说我这块呢,我sleep这块,我就想Rose那不行,因为呢我这呢不能写Rose。相当于你把这个可能出现的编译式异常给他以一个运营式异常的方式呢,给抛出去了。就这呢,以后呢,会见到类似的这种方案啊,咱们暂且的话呢,就先print在里边呢,彻底的给它开始处理了。啊,这个注意一下,而我们这个coll的话呢,就更灵活了,它直接呢就可以呢去往外去肉,而且呢,在我们这个接口里边。这块我们点一下,诶,它这块呢,Rose的还是一个exception。那就相当于你编译时运营时啊,都放马过来都可以啊。
04:03
好,另外的话呢,你还会看到我们这个好呢,它这块有个监控号,这个呢,其实就是泛型的意思了,这个泛型那个V呢,它决定了我们这个靠方法的返回值的类型。那也就是说咱们刚才这块我写的时候呢,在这儿刻意避开了这个泛型,这个时候呢是object,那如果这个位置我写的不是object,这就涉及到我们后边要讲的一个新特性哈,假设这个V呢,我写成了是叫string吧。那其实这个V呢,就是string。言外之意呢,就是我们这个方法的反馈类型啊,不一定是object,其实还可以呢,非常具体。这呢其实就是我们这个Co的这个好处,一会儿我们去总结啊,好,那么现在呢,我们想去便利100以内的偶数,同时呢还想返回它的总和,那我们要用这个方式来写的话呢,就在内部呢定一个sum,然后便利之余呢,我们给萨呢去加等于I,然后最后呢还可以去return。那就挺灵活的,如果你要用run方法去做的话呢。你就不能在里边去水村了。
05:01
啊,你只能是在外边呢,是不是把这个sum变量定义到外边里边呢,去给它赋值,然后这个方法执行结束以后呢,这个值呢就变了。不能以返回的方式去体现了。好,然后在后续这块呢,稍微也有一点区别啊,我们呢去new一个call的一个实现类的对象,比咱们呢使用这个renoable呢,稍微的复杂一点,咱们得把这个对象呢,先放在这个叫啊further task这样一个类当中。造一个这样的一个类的对象,然后把这个对象呢,再放到这个thad里边。得这么着才行,哎,这个first呢,这个我就直接说一下了啊,它呢也实现了able的一个接口,所以这块我们这个thread呢,用的构造器呢,还是我们这个renoable的这样一个构造器。只不过它中间呢,多了这样的一个封装哈,诶start就可以了,然后这时候这个start呢,执行的仍然是我们,诶实现类里边的这个方法要靠方法了。哎,就执行的是他了,行,那就相当于这个线上呢,就具体呢,去掉上面这个靠了。
06:02
行了,然后的话呢,对于我们当前这个操作来讲,你不是有一个反馈值吗。如果你想获取这个返回值的话呢,我们就得需要用到咱们上面提到这个叫first task了,拿着这个哥们呢去调一个方法叫做get方法,然后呢,我们就能得到这个所谓的总和了。哎,就这样就行,那我问一句,你看我们这个操作哈。我是在主线程当中做的,还是在分线程当中做的?主线程是吧,诶所以这块呢,注意它是一个主线程中的操作啊,诶包括呢,咱们昨天呢,讲到这个课后的练习题,然后看你同学也问了啊,就是稍微的还是有点迷糊。就是咱们这块呢,不是有一个题昨天提到了,说我们这个t.sleep这个时候呢,到底是主线程掉的还是分线程掉的是吧。注意这块是主线程调的啊,就是这个呢,你在哪一个线程里边执行,那就是哪个线程呢去。你要是写在你这个start对应的这个run方法里了,掉掉sleep了,那就是你这个。这个分线上去里拉,我要是在这个主线上去调呢,那就是主线上去睡。
07:05
啊,这个注意哈,诶同学说这块这个TT这个线程,这不是让这个分线程去睡吗?其实呢,还可以有一种解释,大家记不记得以前我们讲过一个题目哈,就是这个sleep方法是个静态方法。进来方法的话呢,我们去调这个sleep,用对象调的,其实这个对象如果是个闹呢,是不是也照样能调。是吧,诶所以这块跟你这个T呢没关系,或者换句话说呢,你把这个T呢,如果我就写成了叫my thad了,你可能会更清楚一点,拿累掉的,说白了还是你这个方法在哪个线程里掉的,那就是让哪个线程去睡。所以呢,这是主线上水啊。哎,注意一下。那么这块呢,回过来我们这块呢,做一个run执行,诶上面这块呢,就我们这个分线程呢,打印的100以内的偶数,然后最后呢,是我们这个主线程当中,注意啊,打印的这个总和啊。哎,这个注意一下。好呃,那么这里边儿呢,你看有一个小细节点,大家看一看啊,我呢,这个分线成了。
08:01
按说的话呢,分线程start呢,这个线程已经出去开始执行了,是不是有可能这个主线程马上就开始调这个操作了。对吧,那你说这块要掉的话呢,有可能分线成100以内的偶数,是不是还没便利完呢,这块要get的时候呢,是不是有担心拿不到那个所谓的sum,就是计算完以后的和呀。诶,所以这呢,其实自然而然的,它会有一个阻塞。诶,这个组织呢,是自然而然的哈,诶我们可以呢,演示这个事儿,比如说呢,我在这个位置我加了一个sleep。或者我们再时间长一点,来个一秒钟,我让这个分线程这块呢,每隔一秒钟看它去循环一下,所以它很慢啊,那么我们看一看这个操作呢,会不会马上执行。来,你看我们来一个。上来。非常慢的这个分线上呢,现在去打印你会发现呢,我们这个操作呢,始终是没有执行的。就是因为他一直在等我们这个分线程是不是return啊。诶,只有它return了我们这个主线程这块才开始去get。
09:03
有点像那个照一样是吧。诶,所以从这个角度来看的话呢,其实我们对于主线上来讲呢,按说有点不利是吧,哎这呢也可以理解成是我们这样,诶这种方式里边的一个缺点啊。所以呢,回过来我们针对呢,第一种方式啊进行一个说明,这个说明的话呢,咱们就是与这个renoable这种方式呢,做个对比了啊。啊,因为呢,你跟那个呃,继承的方式呢,也没啥可比性了,咱们都是接口,咱俩比就行好,那么大家来看一看,比较而言的话呢,那肯定呢,我们说这个run的方式就更灵活一些了啊,毕竟这是新增加的一个特性嘛。哎,那它的好处是什么呢?对这块我们看到哈,首先呢,我们提到了说这个靠方法。它呢是可以啊,有返回值啊,这个呢就更灵活是吧。OK,然后另外一个方法呢,呃,另外一个点呢,就是这个靠方法呢,它呢是可以。
10:02
对,可以使用这个Rose的这种方式呢,来处理异常啊。诶,那就意味的话呢,我们不一定非得要用这个track的方式来处理的,所以这种方式呢,也体现了就更灵活一些。哎,那其实呢,还有一个点,就是我刚才提到的,在我们这个,诶call这里边呢,它其实有个泛型,这个泛型的使用呢,其实呢,就决定了我们这个call方法的返回值的类型。也不一定非得是object。啊,这个泛型呢,我们后边再讲啊,这呢对应的就是我们这个。他呢,诶使用了这个泛型参数啊,可以指明具体的啊,靠方法的返回值类型。啊类型啊,这个呢,当然呢也是那就更灵活了是吧。好,总之的话呢,相较于我们这个reno来讲的话呢,我们说呢,好处还是非常明显的啊,然后对应的有没有缺点呢,其实刚才也提到了,就是在我们调用这个靠方法的时候。
11:02
其实呢,这个过程当中,我们此时的这个主线程啊。是不是处在一种阻塞的状态是吧?哎,就是我们这个呢,如果你试图呢,要调离get啊,那我们看一下在这个位置,如果去打印个输入语句哈,这个我写成叫a may线程。上面这块呢,我们还有这个sleep来,我们去做一个run。来看,就是这块呢,其实是不受影响的。就这块儿能执行,但是呢,如果你要是想获取一下我们这个分线程的结果的话呢,这个主线程呢,注意是阻塞的。哎,这个看的是我们的缺点啊。诶,如果诶在主线程中需要呢,获取分线程靠方法它的这个返回值啊。啊,那么则此时的这个主线程啊是阻塞状态的。啊,这个大家注意一下,这才算是它的一个缺点。好,这呢,就我们说的这个第三种方式,它存在的意义呢,就是大家呢,知道这块会有一道笔试题是吧。
12:02
啊,咱们自己呢,写的话,暂且就不用写了啊,那为什么这个不写了呢?实际上呢,我们说啊,在真正开发当中啊,咱们其实用限制的话呢,其实更多的体现都是这种。叫先生池了。啊,说了半天,前面这些呢,都可以不用是吧。哎,先蒸池,这呢是我们真正生产环境当中的一种选择,好,那我们来看一看这个先城池。啊,现在的一个问题啊,有这样一个场景说呢,如果并发的线程数量呀很多。并且呢,每一个线程呢,都是执行一个时间很短的任务呢,就结束了,这样频繁的创建线程就会大大的降低系统的效率,因为频繁的创建线程和消费线程呢,需要时间。那么说有没有一种办法使得线绳呢,可以复用,也就是他完成一个任务之后呢,不要销毁,继续的让他执行其他的任务。啊,答案呢,肯定是可以,哎,否则的话呢,就不用讲这个内容了。这呢,就是我们引入的这个叫线程池,那什么思路呢,就是我提前呢,我先创建好多个线程放到一个池子当中。
13:05
这就叫线程池了。然后呢,如果你需要的话呢,我们有一系列的任务就过来了,每个任务呢,都需要拿一个线程的去操作,那你就任务呢去池子里边呢去啊,他说就捞一个线程来用了啊好,那这块呢,假设我就只有三个线程,那对应的三个任务的话呢,就依次呢拿这三个线程呢去执行,那如果还有其他新的任务呢,那不好意思,我这块呢就只有仨。当然了,我们后期呢,可以去设置这个线程池的参数,比如说初始化的时候呢,有三个我们可以呢,当不够的时候再增加。然后呢,这时候你如果来新的任务呢,这个线程已经都占用了,你可以呢,再去增加线程。OK啊,但是如果要不增加已经达到上限了,那你这块你就先等待。如果呢,我现有的这些任务呢,执行完以后,注意此时的这个线程的话呢,不会说因为任务二的一个执行结束呢,它销毁没有。而是呢,又还回到我们这个线程池当中,那么这个线程的话呢,继续的就可以分配给其他的任务呢去执行。
14:00
啊,那么这呢,也得到了一个资源的很好的重复利用。这就是我们说线程池这样的一个概念。啊,那么刚才提到这个场景呢,诶,我们也可以呢去描述一下,比如说啊大家呢,用这个手机手机的话呢,咱们也看到基本上这个布局啊,都是类似的。啊,一个item一个item,这样呢去存放这呢,其实就是一个list啊,就是一个列表了。好,那么这个列表里边呢,通常我们看到左边呢,都是有一个图片的。新闻类的呀,或者这个美团外卖呀啊等等的是吧,基本上都是这种特征的啊,那么其实呢,这里边这个图片啊,咱们说他呢,要是下载的话呢,通常比较耗时一些。所以呢,一般这种图片啊,咱们都是专门的开一个分线上的去下载的。诶,大家不知道有没有这样的经历啊,就是当你要处在一个网络比较差的这种环境中的时候,比如说你要看这个头条啊,这个信息,你会发现他这个文字的信息呢,已经显示过来了。但这个图片呢,是没有的。或者本地的一个默认的图片是吧,这个呢,就相当于是它是这样一个过程啊,这个我放到左边,我就不在这儿画了,它呢其实呢,是先当你打开这个界面的时候呢,先进行一次联网操作。
15:11
这次联网操作呢,它会把整个这个页面当中呈现出来的这个文本数据呢,帮你下载过来,这种文本数据呢,是非常小的啊,所以呢,网络比较差的时候呢,他们就直接先过来了,这个文本呢就能够显示了。同时的话呢,每一个图片的这个地址。啊,其实是一个URL了啊,就是你这个图片呢,到底是存在服务器的哪个位置,这样一个地址,一个字符串的方式呢,其实也过来了。但是你光给我这个地址没有用,我得需要呢,通过这个地址呢,是不是进行二次联网。接着呢,去下载这个图片。那么第一次联网的话呢,这一个线上呢,就把这个文本呢,其实都一次性的下载了,假设20个,所以你往上滑的话呢,就20个呢,这个item都能看到这个文本数据。呃,那么接下来的话呢,我们每一个图片呢,我专门的开一个线程。那在我们这个当中,一个两个三个四个五个,那我这块就可以开五个线程。
16:04
分别呢,去下载对应的这个图片。那如果这个网要不好的话呢,那就是等半天,那如果这个网要比较好的话呢,随后呢,这个图片呢,就依次呢都显示出来了。啊,那么这个图片呢,下载完以后呢,那几这几个线程怎么处理啊。那如果说呢,我们每一个呢,都是自己新造的线程,那就意味着这几个线程就要销毁了。那如果说我们要是快速的去滑动这个手机屏幕的话呢,相当于呢,很多这个item不都露过脸都出来过。然后呢,你这块呢,都去新建一个线程,你要往上这块滑动的过程当中,是不是就会有大量的线程的创建和销毁。这个显然对于我们资源的消耗呢是非常大的,那怎么办呢,我们就可以呢,使用一个线程池。啊,这里边儿呢,诶,我们提供多少个呢,合适呢。哎,就看你最多需要多少个了,所以这块怎么判断呀,这个一说就细了哈,诶你看啊,假设呢,我这块呢,我就这样放。诶,我放成这样,假设呢,满打满算呢,你看有四个啊,我要稍微的往上移一下,这个是不是就会出去点。
17:02
下边是不是就进来点。哎,其实这块呢,最多是不是就五个了。啊对,也就是说专门用于下载图片的,这个线程的话呢,其实五个就够。你要说这块往上再推,推到极限的话呢,就是这个呢,刚这个到底儿上面这个刚出去。诶你再往这个就还是四个嘛,你再往上一一推,这个呢,出去一半,这个进来一半,其实呢,就还是五个啊,所以这块呢,最多呢,诶这个有几个,其实我们也能够确定下来,然后就相当于呢,这里边的每一个图片呢,你在下载的时候呢,就从我们这个池子里边去取,然后用完以后的话呢,你接着往上滚动的时候呢,下边这个新的进来了,然后呢,你不是也下载完了,或者没下载完,就等一会儿是吧,下载完以后的话呢,我们再去用现成的这个。县城的这个县城。是吧,哎,再去下载就可以了,这样的话呢,就是资源呢重复利用。哎,这样一个场景啊,跟我们这儿呢,说的是一个道理啊。好,这呢,就我们说的这个线程池的这个概念了,那么接着我们其实要说的事儿呢,就是这种方式有什么好处呢。
18:02
想一想。呃,首先呢,怎么着。因为呢,你看我们现在这个线程呢,你是直接拿过来用的,不是呢,你自己拗的是吧。哎,是不是提高了我们这个程序执行的一个效率啊。哎,提高了,哎这个程序来执行的这个效率啊,这个呢,就是因为你这个线程呢是。之前就已经创建好了是吧,所以我在这写一下啊。啊说因为县城已经。哎,提前创建好。哎,创建好乐是吧,哎这样的情况啊,好这一个还有吗。对这个因为呢,你用完的这个线程的话呢,我们接着呢,又去诶对其他任务呢,进行一个处理了,所以这块呢,我们这个资源的话呢,并没有销毁,就是提高了资源的这个。用率是吧。嗯,提高了啊,这个资源的一个复用率。
19:01
啊,这个呢,我们说呃,因为这个执行完的这个线程啊,仍然啊,或者叫并未销毁。啊,并未销毁啊,而是啊,可以继续啊,执行其他的任务。诶,这是我们说的这个好,那这块呢,其实还有一个好处啊,还有一个好处呢,就是我们使用的是线程池,诶如果呢,要是比如我们这个以手机这个为例啊,这是图片,我们快速的滑动呢,这块呢,大量的创建这个资源。这有可能我们内存呢,在有限的情况下呢,有可能你就是在比较早的时候啊,这个安卓手机出现过啊,就是你快速的滑的时候呢,滑到一定程度上,他直接说程序未响应。就挂了。是吧,就是你创业线程过多的时候呢,我这个内存又有限,那不好意思呢,我现在已经搞不定了是吧,这个程序呢,就挂掉了哈,那我们现在的话呢,诶我们使用线程池的,其实这块呢,诶我们可以呢去控制相关的一些参数。
20:02
通过这个参数呢,去限制这个资源的一个使用,比如说呢,我现在这个内存比较有限哈,呃,我追踪呢,给你提供30个线程。啊,再多的给不了了,只能是拿着30个去用啊,你要说任务呢,太多了,50个任务,那不好意思,30个呢,用着20个呢,等待。30个有用完的,你20个人再从里边去拿。所以呢,我们可以呢,去设置相关的参数,对我们这个线程呢,进行一个管理啊。哎,可以设置。哎,相关的这个参数。啊,对,线程池中的。哎,这个线程啊的使用啊进行管理。诶,就是这样的一个逻辑。其实这个事儿的话呢,比较好理解啊。啊,再举一个生活中的场景,比如说啊,这个咱就说北京吧,啊大家呢,想去这个天安门是吧。那一说去北京的话呢,大家可能都会想到这个天安门啊,这个比较有代表性的啊,从小呢,就是我爱北京天安门是吧。啊,假设呢,现在呢,你要从北京那个地儿啊,现在要去这个天安门了,咋去。
21:05
啊,这个呢,就好比是我们现在呢,要有一个需求了啊嗯,那可以怎么着呢,你说我自己造一辆车是吧。啊,传统来讲,我自己造一辆车,造一辆车的话呢,我就骑过去了,骑过去之后呢,没用了。然后呢,就。就地扔了,或者就地给夸张点销毁了。但是你不能在天安门销毁啊,这估计你就够呛,能回来了是吧?好就不用了,那你下次要去的话呢,还得自己再造这个车子。这个呢,就相当于是我们自己创建现场的这种场景。啊,你看这里边儿呢,自己造,你不得花时间吗?啊,然后呢,你这块呢,用完以后呢,你就销毁了,然后别人还用不了啊这种也没有浮动力之说是吧,然后这块呢,没有相关的管理的概念,假设呢,同一个时间啊,10月1号所有人呢,都想去了一下去了。啊,100万人是吧,天安门呢,假设也容不下这块,就会出现一些交通的事故啊等等是吧,拥堵的问题。
22:00
啊,对于网络来讲呢,这个也是会有类似的问题出现。啊,这点都不好怎么办呢?诶,我们选择叫公共交通是吧。那交通。哎,公共交通工具,这个咱们就以公交车为例吧。说呢,你现在呢想去天安门了,坐公交车,哎,这个时候呢,你就不用自己去造个车了,首先呢,快直接上车就走。然后呢,拉完你之后呢,这个车呢,转头还可以拉别人。有复率呢也更好。呃,那另外呢,还提到这个相关的管理的这个概念,你比如说现在10月1号,大家所有人呢,都想去这个天安门,那公交车的话呢,我们可以呢,控制它的一个发车频率。比如这块已经达到这个天安门的容载的上限了。啊,就跟说服务器呢,它这个上限已经基本上要饱和了,那这块我们就可以控制它的发车频率是吧,原来呢五分钟一趟,现在呢,你改成15分钟一趟。啊,那这块呢,这个就不会导致这块呢拥堵嘛。哎,就很好的能够控制这块的一个人流量啊。这个呢,就别拿共享单车来说了。这个呢,其实还有点儿像是。
23:00
自己说了算的,因为没有这个管理的概念是吧。哎,我记得是刚出共享单车的时候呢,在那个深圳哈,当时呢是。呃,大梅州还是小梅州那块这个呢,所有的共享单车就是当天啊,不知道是什么情况就全部过去了。然后呢,导致那块呢,就是整个人就瘫痪了。啊,所以呢,这不后期要大力整治共享单车的问题是吧。啊,前段时间在北京还出过一个事儿。啊,这个是D第一章史哈。出了一个活动啊,这个应该是无意的啊,这个活动呢,是当时只要是到这个西直门的都可以免单。啊,所以呢,那一个下午的话呢,西直门就废了。啊,就全部都涌过去了。啊,这个呢,后期呢还得。这个惩罚了是吧?啊OK啊行,诶这块的话呢,就我们提到这个线程池的一个好处啊,这个好处完了以后的话呢,那我们稍微的得看一眼啊,这个怎么来做这个事儿,大家做一个了解就行,那这样来处理的。诶使用线程池的话呢,这块我们照样呢还得去诶考虑比如说用一个实现的方式,当然呢,你用也可以啊,这时我们就演示一下randomable了。
24:05
我呢是实验这个random这块呢,指命这个线程,你想干什么,它呢打印偶数啊。然后另外呢,我又造了个县城,它呢是来打印基数的。嗯,我刚才说错了,不应该说造了一个县城。这跟县城没关系。诶你别说呢,诶这块怎么都实现了,然后我们不是说第四种方式,怎么还用第二种方式呢。咱们线程的创建呢,是不是都得是new thread呀?是吧,E包括呢,咱们刚才这个发现这个是。所以现成的是通过new thread来体现的,我现在呢,只是指明了我要做的事儿是吧,这个其实目前还没有现成的这个概念啊。那我把这两个呢类呢先声明好,然后呢,我通过这样的一种方式,细节大家就不用管了哈,我呢就造了一个线程池。这个池子里边呢,我就初始化呢,就放十个线程。
25:00
哎,然后这块我们做了一个强转啊,因为这呢,就是提到提到它就是个线程池了。好,然后呢,我还可以呢,去设置相关的参数,这就我们所谓的这种管理了,我呢上线比如说可以最多有50个线程。这种我就提前了,都已经提供好了啊,然后你需要做的事儿呢,就是你只需要告诉我你想干什么。我们就拗一下上面这个runable的这个实现类的这个对象了,其实呢,就只需要告诉我们,诶帮我去调一下run方法。咱们这块呢,你可没有看到相关的new thread的代码,因为这里边儿已经帮我们做好了。诶,所以呢,我们就把你要做的这个事儿的这个run方法呢,封装在这个对象里边,哎,往这一放,我就自动的会去执行你上面的两个run了。然后最后呢,比如说这个池子要不用了,你就给他杀当一下是吧,好,我们做一个run。这时候呢,就是我们这个池子里边呢,对应的这不两个线程嘛,一个线程打印这个奇数的,一个线程打印偶数的。没问题。哎,这呢,就我们一个举例啊,那这个线程池的话呢,它也可以去适配咱们的啊的话呢,如果需要有返回值的话呢,你可以用这个sum me这个方法。
26:04
OK,在实际开发当中啊,咱们其实呢,如果说你这个线程呢,确实多次被用,咱们其实选择的都是线程池的方式。而这种池的话呢,通常啊,这个要么呢是直接封装好了啊,你要自己用的话呢,可以类似的这样的场景去使用,那具体关于线程池的使用还是guc当中建是吧。哎,咱们在基础阶段上就不深入的去展开来讲了。啊,在整个Java里边呢,后边一个高级内容就是高并发了,其实呢,就是说这个GC的这种场景。那么整个关于县城,咱们就整个告一段落。
我来说两句