【Java】线程池技术(二)ThreadPoolExecutor的基本定义

线程池初始化与定义

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

线程池构造方法的入参含义分别如下:

  • corePoolSize:核心线程数,必须大于或等于 0
  • maximumPoolSize:最大线程数,必须大于 0 且大于或等于核心线程数
  • keepAliveTime:空闲线程存活时间,必须大于或等于 0
  • unit:存活时间单位 TimeUnit
  • workQueue:阻塞队列,存储通过 execute() 方法提交的未能开始执行的任务。常见的选择有:
    • ArrayBlockingQueue:基于数组结构的有界阻塞队列,FIFO
    • PriorityBlockingQueue:具有优先级的无界阻塞队列,较少使用
    • LinkedBlockingQueue:基于链表结构的无界阻塞队列,吞吐量通常要高于 ArrayBlockingQueue,FIFO
    • SynchronousQueue:不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于 LinkedBlockingQueue
  • threadFactory:线程创建工厂,一般可以用默认的
  • handler:饱和/拒绝策略,有以下四种策略:
    • ThreadPoolExecutor.AbortPolicy:(默认)阻塞队列已满,丢弃任务并抛出 RejectedExecutionException 异常。
    • ThreadPoolExecutor.DiscardPolicy:阻塞队列已满,丢弃任务,但是不抛出异常。
    • ThreadPoolExecutor.DiscardOldestPolicy:阻塞队列已满,丢弃队列最前面的任务,然后重新尝试加入队列执行任务(重复此过程)。
    • ThreadPoolExecutor.CallerRunsPolicy:由发起调用的线程自己去执行该任务(如果主线程运行结束,则丢弃该任务);会降低新任务的提交速度,影响程序的整体性能。
    • 也可以根据实际需求自定义拒绝策略,实现 RejectedExecutionHandler 接口

当 ThreadPoolExecutor 线程池被创建的时候,里面是没有创建工作线程的,直至有任务调用了 execute() 方法时,才开始创建工作线程。除非调用 prestartAllCoreThreads() 或者 prestartCoreThread() 方法,可以手动预创建线程。调用 execute() 方法时的具体工作原理为:

  1. 如果当前工作线程数小于核心线程数,则创建新的线程执行任务,否则将任务加入阻塞队列;
  2. 如果阻塞队列满了,则根据最大线程数创建额外(非核心工作线程)的工作线程去执行任务;
  3. 如果工作线程数达到了线程池允许的最大线程数,则根据拒绝策略去执行。
  4. 非核心线程的存活时间到期的话,线程资源将会被回收。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值