浅谈如何理解线程池的概念

Java线程池是我们高并发开发当中比较常用的一个解决方案。
多用于一些处理时间短暂,但是程序量大的操作环境当中,可以有效地解决线程的创建和销毁非耗资源速度慢的问题。


什么是线程?

线程是调度CPU的最小单元,也叫做轻量级进程LWP(Light Weight Process)
Java中有两种线程模型:

  1. 用户级线程(ULT)(Uer Level Thread)
  2. 内核级线程(KLT)(Kernel Level Thread)
  • ULT:用户程序实现,不依赖操作系统核心,应用提供创建,同步,调度和管理线程的函数来控制用户线程,不需要用户态/内核态的切换,速度快,内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。
  • KLT:系统内核管理线程(KLT),内核保存线程的状态和上下文的信息,线程阻塞不会引起进程阻塞。在处理器系统上多线程在多处理器上并行运行。现成的创建,调度和管理由内核完成,效率比UTL慢,比进程操作快。

市面上绝大多数的Java虚拟机都是使用的KLT,及系统内核管理线程
文字描述比较抽象,我们来画一个图描述一下ULTKLT的区别


undefined


JVM由于在用户空间,无权使用内核空间,只能调用系统开放的API(如:Linux开放的p_thread函数)去操作线程,在映射到底层的CPU上,由于调度API需要提高权限,所以会把自身状态陷入到内核态来取得权限。
用户所有的线程都会存放在线程表中,由内核统一的调度和维护。
这就是为什么会进行用户态/内核态状态切换的原因。


undefined


根据上图,JVM创建和执行线程可以列为一下这么几个步骤

  1. 线程会使用库调度器
  2. 之后陷入到内核空间
  3. 创建内核线程
  4. 内核中的线程会被维护到线程表中
  5. 由操作系统调度程序去调度
  6. CPU会根据调度算法分配时间
  7. 把没有执行完的线程写入给你高速内存区(SSP)

内核空间中有一个高速内存区SSP(程序任务运行状态段)是用于存储还没有执行完成,但是被分配的时间已经用完的线程中的数据,,等待下一次被分配到了时间后,九八保存在SSP里的上下文信息加载到CPU的缓存。

综上所述,线程是一个稀缺资源,他的创建和销毁是一个相对偏重且消耗资源的操作,而Java线程依赖于内核进程,创建线程需要进行操作系统状态切换,为避免过度消耗,我们要设法重用线程执行多个任务。


线程池就是一个线程缓存,负责对线程进行统一分配,调度与监控

他的优点有很多,最突出的优点就是:

  • 重用存在的线程,减少线程的创建,消亡所用开销,提升性能
  • 提高响应速度。当任务到达时,可以不需要等待线程的创建就可以立即执行
  • 提高线程的可管理性,可统一分配,调度和监控。
页面: 1 2

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Captcha Code