必须搞明白的Java线程池原理

Java线程理解

两种线程模型

首先,线程是调度CPU的最小单元,也叫轻量级进程LWP(Light Weight Process)

在这里插入图片描述

  • 用户线程(ULT):用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/核心态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括他的线程)阻塞。

  • 内核级线程(KLT):系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。再多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比UTL要慢,比进程操作快。

Java虚拟机用的是哪一种模式呢?

市面上JVM使用线程模型99%以上都是KLT。
接下来我们就要讨论一下ULT与KLT的用户空间和内核空间分配问题。我们经常使用的系统Windows,Linux,Unix全部都是有内存空间的,这是一个逻辑地址,而不是一个物理地址。
它的分配是由操作系统来进行分配的,比如你的电脑是8G内存,操作系统会将其分配成逻辑空间。这个大小就是8G,8G分为用空空间和内核空间,他们的区别在于权限,权限问题就是防止一些无关人员可以越级去操作一些敏感的业务。
我们都知道软件需要驱动才能使用CPU资源,那么JVM是怎么创建线程的呢?它是不能直接使用底层硬件的。比如Linux系统,JVM会去调用操作系统的API,Linux中提供了p_thread,之后才映射到了底层CPU。

Java线程与系统内核线程

Java线程创建是依赖系统内核,通过JVM调用系统库创建内核线程,内核线程与Java-Thread是1:1的映射关系。

在这里插入图片描述

执行过程为JVM的进程进入,用户空间进行分配Thread1,Thread2,Thread3…,通过调度器进入内核空间。这时候底层CPU开始发挥功能,它起到了任务调度的作用。将第一个任务分配到内核空间中其中的一个内核线程中,比如50nm,之后依次进行分配。当第一个任务执行完后,CPU会继续分配第二个任务。如果第一个内核线程没有执行完,CPU会将此数据写到内核的程序运行状态段中,程序运行状态段是一个高速的内存区,起到临时保存作用。也叫SST。SST之后会加载回到CPU缓存中,CPU有三级缓存,其中包括指令寄存器,数据则加载到数据寄存器。之后继续执行,最后程序结束。

我们都知道,Java运行中,创建线程的时候,会有一个线程栈,它会对应程序的栈帧指令,栈、针指令的作用就是告诉程序要怎么做。

线程池的意义

在这里插入图片描述

线程是稀缺资源,它的创建与销毁是一个相对偏重且耗资源的操作,而Java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配、调优与监控。

什么时候使用线程池?

  • 单个任务处理时间比较短
  • 需要处理的任务数量很大

线程池优势

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

线程池底层实现

在这里插入图片描述

我们常用的有ThreadPoolExecutor,ForkJoinPool,延时类等等,全部都是继承Executor的父类。ThreadPoolExecutor的属性包括corePoolSize: 2, maximumPoolSize: 3, keepAliveTime: 60。抛异常的默认策略,
另外,多线程是不能保证线程顺序执行的

线程池的五种状态

在这里插入图片描述

  • Running:能接受新任务以及处理已添加的任务
  • Shutdown:不接受新任务,可以处理已经添加的任务
  • Stop:不接受新任务,不处理已经添加的任务,并且中断正在处理的任务。其方法为shutdownNow().
  • Tidying:所有的任务已经终止,ctl记录的“任务数量”为零,ctl负责记录线程池的运行状态与活动线程数量
  • Terminated:线程池彻底终止,则线程池转变为terminated状态

对于源码解读,源码中的COUNT_BITS = Integer.SIZE - 3, 用线程池前三个记录线程池的生命状态。高3位记录线程池生命状态,低29位记录当前工作线程数。

当然这些也只是对Java线程池理解的皮毛,多读源码,就是多靠近大神一部。未来可期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值