说一下线程池内部工作原理

多线程技术是服务端开发人员必须掌握的技术。
线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。
在Java中有一个Executors工具类,可以为我们创建一个线程池,其本质就是new了一个ThreadPoolExecutor对象。

线程池创建

先看一下ThreadPoolExecutor参数最全的构造方法:

  • corePoolSize:线程池的核心线程数,即便是线程池里没有任何任务,也会有corePoolSize个线程在候着等任务。
  • maximumPoolSize:最大线程数,不管你提交多少任务,线程池里最多工作线程数就是maximumPoolSize。
  • keepAliveTime:非核心线程的存活时间,如果等了keepAliveTime时长还没有任务可执行,则线程退出。
  • unit:指定keepAliveTime的单位,比如秒:TimeUnit.SECONDS。
  • workQueue:一个阻塞队列,提交的任务将会被放到这个队列里。
  • threadFactory:线程工厂,用来创建线程,主要是为了给线程起名字,默认工厂的线程名字形如:pool-1-thread-3。
  • handler:拒绝策略,当线程池里线程被耗尽,且队列也满了的时候会调用。

以上就是创建线程池时用到的参数,需牢记。

线程池执行流程

这里用一个图来说明线程池的执行流程:

任务被提交到线程池,会先判断当前线程数量是否小于corePoolSize,如果小于则创建线程来执行提交的任务,否则将任务放入workQueue队列,如果workQueue满了,则判断当前线程数量是否小于maximumPoolSize,如果小于则创建线程执行任务,否则就会调用handler,以表示线程池拒绝接收任务。

 

参考:

 

posted @ 2021-11-30 23:43  残城碎梦  阅读(61)  评论(0编辑  收藏  举报