java线程池理解

线程池

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

1、两种线程模型

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

jvm使用的是内核级线程

2、线程池的意义

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

2.1、什么时候使用线程池
  • 单个任务处理时间比较短
  • 需要处理的任务数量很大
2.2、线程池的优势
  • 重用存在的线程,减少线程创建、消亡的开销,提高性能
  • 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立刻执行。
  • 提高线程的可管理性,可听译分配,调优和监控

3、线程池创建

1、可以通过Executors的静态方法创建

2、可以直接new想要的线程池

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler){...}
ThreadPoolExecutor pool=new ThreadPoolExecutor(1,1,60,TimeUnit.SECONDS,new ArrayBlockQueue<Runnable>(5),Executors.defaultThreadFactory)
  • corePoolSize:核心线程池大小
  • maximumPoolSize:最大线程池大小
  • keepAliveTime:没有任务处理时,线程最大等待时间,超过时间,除核心线程都销毁
  • TimeUnit:时间单位
  • workQueue:阻塞队列
    1. FIFO:在任意时刻,不管并发多高,永远只有一个线程能够进行队列的入队或者出队操作!线程安全的队列
    2. 分为有界和无界队列:队列满,只能进行出队操作,所有入对的操作必须等待,也就是被阻塞

4、线程池执行原理

在这里插入图片描述

初始化线程池中线程是0,当有任务时,线程池会创建相应的线程来执行任务,当核心线程满了,任务会进入阻塞队列,当阻塞队列满了,线程池会创建额外线程来执行(注意此时执行的是新加入进来的线程而不是阻塞队列中的线程,如果要保证没有插队执行,则不能有非核心线程),直到线程数到达线程池最大数量,当额外线程也都在工作,进入新的任务时,线程池提供了四种拒绝执行策略,也可以自己创建策略。

5、线程池的五种状态

  • Runnung

    能接受新任务以及处理已添加的任务

  • Shutdown

    不接受新任务,可以处理已经添加的任务

  • Stop

    不接受新任务,不处理已经添加的任务,并且中断正在处理的任务

  • Tidying

    所有的任务已经停止,ctl记录的“任务数量”为0,ctl负责记录线程池的运行状态与活动线程数量

  • Terminated

    线程池彻底终止,则线程池变为terminated状态

tl负责记录线程池的运行状态与活动线程数量

  • Terminated

    线程池彻底终止,则线程池变为terminated状态

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值