Java中线程池的理解

  • 作者: 凯哥Java
  • 并发
  • 时间:2020-05-21 10:14
  • 53人已阅读
简介 Java中线程池的理解通过前面讲解,我们知道了Java中三种获取多线程的方法了。但是,在实际企业中,经常使用到的是第四种—使用线程池获取线程。在讲解这种获取方式之前,我们先来聊聊线程池是什么?为什么要使用线程池,也就是线程池有哪些特点。通过本文学习之后,你会对线程池有所理解。然后我们再来看看跟着凯哥(凯哥Java:kaigejava)一起学线程池这个系列教程将会有什么收获。一:生活中池化案例我们先

Java中线程池的理解

通过前面讲解,我们知道了Java中三种获取多线程的方法了。但是,在实际企业中,经常使用到的是第四种—使用线程池获取线程。在讲解这种获取方式之前,我们先来聊聊线程池是什么?为什么要使用线程池,也就是线程池有哪些特点。通过本文学习之后,你会对线程池有所理解。然后我们再来看看跟着凯哥(凯哥Java:kaigejava)一起学线程池这个系列教程将会有什么收获。

一:生活中池化案例

我们先来看看我们熟悉的几种池子。游泳池(存放水的池子)、数据库连接池(存放数据库连接的池子)。

生活中的游泳池大家很熟悉吧。夏天到了,去游个泳很爽吧。我们来看看游泳池


游泳池的工作:存放水资源的池子,供大家使用。

好处:

1:一个游泳池可用供应多个人来游玩,这样就降低了资源的消耗。回想下你自己洗澡的时候,是不是水直接就从下水道流走了,如果在游泳池的话,就会重复利用(额,这个举例有点……,大家明白是为了降低资源消耗就可用);

2:游泳池可用在没有开门之前就先向游泳池中注入水,zheya那个等开门后,有人来游玩的话,就可以直接玩了。不用再等待,这样就提高了响应的速度了。

同样,数据库连接池同样。

通过上面我们可用知道线程池具有同样的功能了。那么我们来看看线程池.

二:线程池

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放到队列中,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等待其他线程执行完毕,再从队列中取出任务来执行。

三:使用线程池的优点

线程池主要特点:

线程复用;控制最大并发数;管理线程。

第一:降低资源消耗。通过重复利用已经创建的线程降低线程创建和销毁造成的消耗。

我们知道当使用new关键字创建对象的时候,JVM需要向系统申请资源,当对象运行完成之后,又需要CG垃圾回收器进行回收的。这个创建和销毁也是需要消耗资源的。

第二:提高响应速度。当任务到达时候,任务可以不需要再等到线程创建就能立即执行。

在系统启动的时候,我们预先初始化一定数量的线程放到线程池中,这样,如果有需要用的线程的地方,就可以直接调用了,不用再等待了(可用理解为游泳池馆在开门之前,就已经把水注入到池子中了,这样,开门后,有人过来,不用再等待)。.

第三:提高线程的可管理性。线程是稀缺的资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

这里需要说明一点,如果线程过多,并发量过大,会造成CPU的过度切换从而影响到系统的性能。

CPU上下文切换:

所谓的CPU上下文切换就是,CPU在执行的时候,不是执行一个任务一条道走到底的,CPU在执行的时候,并非把一个任务执行完成才执行另外一个的而是切换着来的。比如A任务需要在CPU中执行10个步骤。在CPU实际执行的时候,先执行A任务的第一个步骤,执行完A1之后,会把A任务挂起,切换到B任务中,执行B2,当B2执行完成后,有可能会执行C5或者是A2的。这种上下文切换也会消耗资源和时间的。如果线程的并发量控制不好的话,就会导致CPU频繁的进行上下文切换,这样是很影响性能的,而且会导致CPU负载过高的。通过线程池的话,我们就可以有效的控制线程的并发数量,从而对我们开发的系统进行调优处理。

本文是凯哥(凯哥Java:kaigejava)讲解线程池的第一篇:线程池的理解。我们来看看线程池这个系列教程,会学到哪些东西,请看下图:


TopTop