对线程池的基本理解

35 阅读2分钟

线程池的好处

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

线程池的参数

public ThreadPoolExecutor(int corePoolSize,  
                        int maximumPoolSize,  
                        long keepAliveTime,  
                        TimeUnit unit,  
                        BlockingQueue<Runnable> workQueue,  
                        ThreadFactory threadFactory,  
                        RejectedExecutionHandler handler)

参数含义: corePoolSize:线程池核心线程数量 maximumPoolSize:线程池最大线程数量 keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间 unit:存活时间的单位 workQueue:存放任务的队列 handler:超出线程范围和队列容量的任务的处理程序

线程池工作原理

提交一个任务到线程池中,线程池的处理流程如下:

  1. 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
  1. 线程池判断工作队列是否已满,如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
  1. 判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

image.png

拒绝策略

image.png 总共有6中方法但是主要有4种拒绝策略:

  1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
  1. CallerRunsPolicy:只用调用者所在的线程来处理任务
  1. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
  1. DiscardPolicy:直接丢弃任务,也不抛出异常

一般情况下,线程池自带的无法满足业务时,自定义一个线程池的拒绝策略。需要实现RejectedExecutionHandler接口,并实现其中的方法。

image.png