Java线程池 通过ThreadPoolExecutor构造器认识四种线程池

ThreadPoolExecutor构造器

  • int corePoolSize: 核心线程池大小
  • int maxnumPoolSize: 最大线程池大小
  • long keepAliveTime :超时时间(超时了没有人调用就会释放)
    • 特点注意: 这个超时时间控制的时非核心线程数的回收时间,核心线程永远不会被回收
  • TimeUnit unit: 超时单位
  • BlockingQueue< Runnable> workQueue: 阻塞队列(当前没有空闲线程时,任务会放入阻塞队列)
  • ThreadFactory threadFactory: 线程工厂,用来创建线程
  • RejectedExecutionHandler handler: 拒绝策略
  •  
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

线程池类型

一般通过Executors 工具类创建线程池

SingleThreadExecutor

  • 一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,任务按照阻塞队列先进先出的顺序执行
  • 通过源码发现,SingleThreadExecutor的参数:
    • corePoolSize = 1 : 核心线程池大小为1
    • maxnumPoolSize = 1 : 最大线程池大小也为1
    • keepAliveTime = 0 : 非核心线程空闲时立刻释放(SingleThreadExecutor不会有非核心线程,因为maxnumPoolSize=corePoolSize=1,所以该参数忽略)
    • workQueue = new LinkedBlockingQueue(): 基于链表实现的阻塞队列,队列最大可容纳Integer.MAX_VALUE个任务
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

FixedThreadPool

  • 一个固定大小的线程池,corePoolSize=maxnumPoolSize,即核心线程数等于最大线程数
  • 如果当前运行的线程数少于corePoolSize,会立刻创建新线程执行任务,否则将任务加入到LinkedBlockingQueue中
  • 用户可以指定线程池的大小
  • 优点: 效率高,节省了创建线程的开销
  • 缺点: 不会释放工作线程,会占用一定的系统资源
 public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
  • 1
  • 2
  • 3
  • 4
  • 5

CachedThreadPool

  • 可缓存线程池,一个可根据需要无限(其实最大为21亿)创建新线程的线程池.
  • 如果当前没有线程可用,会创建一个新的线程来执行任务;如果还有执行完没有被销毁的线程,就会复用该线程.
  • 当有线程空闲超过一分钟后,该线程被回收释放
  • 适用场景:
    • 耗时较短的任务
    • 任务处理速度 > 任务提交速度
  • 通过源码,CachedThreadPool参数如下:
    • corePoolSize =0 :核心线程池大小为0
    • maxnumPoolSize = Integer.MAX_VALUE:线程池最大线程数为21亿
    • keepAliveTime = 60L : 非核心线程空闲存活时间为60,单位为秒(即一分钟)
    • workQueue = new SynchronousQueue(): 是一个没有数据缓冲的阻塞队列,内部没有任何存放元素的能力.每次只能put(放入)一个任务,第二次put时会被阻塞,直到take操作(取出)任务为止.同时take操作在队列为空时也处于阻塞状态
public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }
  • 1
  • 2
  • 3
  • 4
  • 5

ScheduleThreadPool

  • 周期任务池(延迟任务池),主要用来在给定的延迟之后运行任务,或者定期执行任务,在功能上与Timer(定时器)类似
  • 参数定义说明:
    • corePoolSize :核心线程池大小由用户自定义
    • maxnumPoolSize = Integer.MAX_VALUE:线程池最大线程数为21亿
    • keepAliveTime =0 : 非核心空闲线程立刻回收释放
    • workQueue = new DelayedWorkQueue() :一个优先级队列,按照任务延时时间的不同进行排序,延时时间越短地就排在队列的前面,先被获取执行。
//为了实现周期调度功能,ScheduleThreadPool的实现和前三种线程池实现不太一样
public class ScheduledThreadPoolExecutor
        extends ThreadPoolExecutor
        implements ScheduledExecutorService {

    public ScheduledThreadPoolExecutor(int corePoolSize) {
        //调用了父类ThreadPoolExecutor的构造方法
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值