线程池的使用

创建线程池参数详解

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
  • 核心线程池(corePoolSize)
    线程池的大小,当核心线程池未满时,任务首先会进入此处
  • 最大线程数(maximumPoolSize)
    最大线程数的数量等于核心线程池的大小加上阻塞队列的大小
  • 线程存活时间(keepAliveTime)
    阻塞队列中的线程等待时间
  • 时间单位(unit)
    阻塞队列中的线程等待时间
  • 阻塞队列(workQueue)
    添加任务是,如果核心线程池满了,会进入阻塞队列
  • 线程工厂(threadFactory)
    可以自定义线程参数(比如线程名字)
  • 拒绝策略(handler)
    达到最大线程池数量的大小之后,再有任务添加,会执行该策略

任务进入线程池时,首先会进入核心线程池,直到达到核心线程数量,如果在有任务添加,会进入阻塞队列,当添加的任务数量达到最大线程池数量时如果有任务添加,会执行拒绝策略。

  • 阻塞队列
    1. ArrayBlockingQueue:由数组结构组成的有界阻塞队列
    2. LinkedBlockingQueue:由链表结构组成的有界阻塞队列(默认值:Integer.MAX_VALUE)
    3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列
    4. DelayQueue:使用优先级队列实现的延迟无界阻塞队列
    5. SynchronousQueue:不存储元素的阻塞队列,即单个元素的队列
    6. LinkedTransferQueue:有链表结构组成的无界阻塞队列
    7. LinkedBlockingDeque:有链表结构组成的双向阻塞队列
  • 拒绝策略
    1. AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止程序正常运行。
    2. CallerRunsPolicy:该策略既不会抛弃任务,也不会抛出异常,而是将任务退回到调用者执行。
    3. DiscardOldestPolicy:抛弃队列中等待最久的任务,然后将新任务加入队列。
    4. DiscardPolicy:直接丢弃任务,不予任务处理也不抛出异常。

计算设置线程池最大线程数

  1. 服务器是CPU密集型:CPU核数+1
  2. 服务器是IO密集型
    1. 由于IO密集型任务线程不是一直在执行任务,则尽量配置多的线程(CPU核数*2)
    2. CPU核数/1-阻塞系数(阻塞系数一般在0.8~0.9之间)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值