回炉重造之java基础篇:线程池

为什么用线程池

1、创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率

2、线程并发数量过多,抢占系统资源从而导致阻塞
运用线程池能有效的控制线程最大并发数

3、对线程进行一些简单的管理
延时执行、定时循环执行的策略等

线程池ThreadPoolExecutor提供了四个构造函数

五个参数的构造函数

1
2
3
4
5
public ThreadPoolExecutor(int corePoolSize,   // int corePoolSize => 该线程池中核心线程数最大值
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)

六个参数的构造函数-1

1
2
3
4
5
6
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)

六个参数的构造函数-2

1
2
3
4
5
6
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)

七个参数的构造函数

1
2
3
4
5
6
7
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
  • int corePoolSize => 该线程池中核心线程数最大值

    核心线程:

    线程池新建线程的时候,如果当前线程总数小于corePoolSize,则新建的是核心线程,如果超过corePoolSize,则新建的是非核心线程

    核心线程默认情况下会一直存活在线程池中,即使这个核心线程啥也不干(闲置状态)。

    如果指定ThreadPoolExecutor的allowCoreThreadTimeOut这个属性为true,那么核心线程如果不干活(闲置状态)的话,超过一定时间(时长下面参数决定),就会被销毁掉

    很好理解吧,正常情况下你不干活我也养你,因为我总有用到你的时候,但有时候特殊情况(比如我自己都养不起了),那你不干活我就要把你干掉了

  • int maximumPoolSize
    该线程池中线程总数最大值

    线程总数 = 核心线程数 + 非核心线程数。核心线程在上面解释过了,这里说下非核心线程:

    不是核心线程的线程(别激动,把刀放下…),其实在上面解释过了

  • long keepAliveTime
    该线程池中非核心线程闲置超时时长

    一个非核心线程,如果不干活(闲置状态)的时长超过这个参数所设定的时长,就会被销毁掉

    如果设置allowCoreThreadTimeOut = true,则会作用于核心线程

  • TimeUnit unit

    keepAliveTime的单位,TimeUnit是一个枚举类型,其包括:

    NANOSECONDS : 1微毫秒 = 1微秒 / 1000

    MICROSECONDS : 1微秒 = 1毫秒 / 1000

    MILLISECONDS : 1毫秒 = 1秒 /1000

    SECONDS : 秒

    MINUTES : 分

    HOURS : 小时

    DAYS : 天

  • BlockingQueue workQueue

    该线程池中的任务队列:维护着等待执行的Runnable对象

分享到: