zoukankan      html  css  js  c++  java
  • Java基础

    ThreadPoolExecutor

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

    corePoolSize: 线程池维护线程的最少线程数,也是核心线程数,包括空闲线程
    maximumPoolSize: 线程池维护线程的最大线程数
    keepAliveTime: 线程池维护线程所允许的空闲时间
    unit: 程池维护线程所允许的空闲时间的单位
    workQueue: 线程池所使用的缓冲队列
    handler: 线程池对拒绝任务的处理策略

    当一个任务通过execute(Runnable)方法欲添加到线程池时:
    1、如果当前线程池中的数量小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务
    2、如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
    3、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量
    小于maximumPoolSize,建新的线程来处理被添加的任务。
    4、如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,
    那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
    5、当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。
    这样,线程池可以动态的调整池中的线程数。

    handler表示拒绝处理任务时的策略,类型为RejectedExecutionHandler,

    当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略:

    (1)ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

    (2)ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

    (3)ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

    (4)ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

    线程池中默认使用:private static final RejectedExecutionHandler defaultHandler =new AbortPolicy()

    参考资料:

    深入理解java线程池—ThreadPoolExecutor

    Java多线程-线程池ThreadPoolExecutor构造方法和规则

  • 相关阅读:
    人工智能发展与模型定制化趋势
    Merry Christmas-集成华为HMS ML Kit手部关键点识别来接住圣诞老人的礼物吧!
    快速构建ML Kit自定义模型,实现特定领域图像/文本分类
    华为consumeOwnedPurchase消耗接口返回-1错误码
    超简单集成华为恶意URL检测,保障用户访问安全
    深入解析 C# 的 String.Create 方法
    .NET 内存泄漏的争议
    Centos相关介绍 (连接别人)
    阿里云 Nginx.conf文件配置详解
    阿里云使用Nginx部署vue项目
  • 原文地址:https://www.cnblogs.com/wangwangfei/p/13198892.html
Copyright © 2011-2022 走看看