说一下线程池内部工作原理
多线程技术是服务端开发人员必须掌握的技术。
线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建和销毁。
在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,以表示线程池拒绝接收任务。
参考: |