全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java ThreadPoolExecutor的参数深入理解

Java ThreadPoolExecutor的参数深入理解

一、使用Executors创建线程池   

        之前创建线程的时候都是用的Executors的newFixedThreadPool(),newSingleThreadExecutor(),newCachedThreadPool()这三个方法。当然Executors也是用不同的参数去new ThreadPoolExecutor

    1. newFixedThreadPool()

    创建线程数固定大小的线程池。 由于使用了LinkedBlockingQueue所以maximumPoolSize 没用,当corePoolSize满了之后就加入到LinkedBlockingQueue队列中。每当某个线程执行完成之后就从LinkedBlockingQueue队列中取一个。所以这个是创建固定大小的线程池。

 public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                   0L, TimeUnit.MILLISECONDS,
                   new LinkedBlockingQueue<Runnable>());
  }
 public ThreadPoolExecutor(int corePoolSize,
               int maximumPoolSize,
               long keepAliveTime,
               TimeUnit unit,
               BlockingQueue<Runnable> workQueue) {
   this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
       Executors.defaultThreadFactory(), defaultHandler);
  }

   2.newSingleThreadPool()

    创建线程数为1的线程池,由于使用了LinkedBlockingQueue所以maximumPoolSize 没用,corePoolSize为1表示线程数大小为1,满了就放入队列中,执行完了就从队列取一个。

 public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
      (new ThreadPoolExecutor(1, 1,
                  0L, TimeUnit.MILLISECONDS,
                  new LinkedBlockingQueue<Runnable>()));
  }

    3.newCachedThreadPool()

    创建可缓冲的线程池。没有大小限制。由于corePoolSize为0所以任务会放入SynchronousQueue队列中,SynchronousQueue只能存放大小为1,所以会立刻新起线程,由于maxumumPoolSize为Integer.MAX_VALUE所以可以认为大小为2147483647。受内存大小限制。

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                   60L, TimeUnit.SECONDS,
                   new SynchronousQueue<Runnable>());
  }
public ThreadPoolExecutor(int corePoolSize,
             int maximumPoolSize,
             long keepAliveTime,
             TimeUnit unit,
             BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
       Executors.defaultThreadFactory(), defaultHandler);
  }
  

二、使用ThreadPoolExecutor创建线程池

ThreadPoolExecutor的构造函数

 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.corePoolSize = corePoolSize;
    this.maximumPoolSize = maximumPoolSize;
    this.workQueue = workQueue;
    this.keepAliveTime = unit.toNanos(keepAliveTime);
    this.threadFactory = threadFactory;
    this.handler = handler;
  }

参数:

        1、corePoolSize核心线程数大小,当线程数<corePoolSize ,会创建线程执行runnable

        2、maximumPoolSize 最大线程数, 当线程数 >= corePoolSize的时候,会把runnable放入workQueue中

        3、keepAliveTime  保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。

        4、unit 时间单位

        5、workQueue 保存任务的阻塞队列

        6、threadFactory 创建线程的工厂

        7、handler 拒绝策略

任务执行顺序:

        1、当线程数小于corePoolSize时,创建线程执行任务。

        2、当线程数大于等于corePoolSize并且workQueue没有满时,放入workQueue中

        3、线程数大于等于corePoolSize并且当workQueue满时,新任务新建线程运行,线程总数要小于maximumPoolSize

        4、当线程总数等于maximumPoolSize并且workQueue满了的时候执行handler的rejectedExecution。也就是拒绝策略。

ThreadPoolExecutor默认有四个拒绝策略:

        1、ThreadPoolExecutor.AbortPolicy()   直接抛出异常RejectedExecutionException

        2、ThreadPoolExecutor.CallerRunsPolicy()    直接调用run方法并且阻塞执行

        3、ThreadPoolExecutor.DiscardPolicy()   直接丢弃后来的任务

        4、ThreadPoolExecutor.DiscardOldestPolicy()  丢弃在队列中队首的任务

当然可以自己继承RejectedExecutionHandler来写拒绝策略.

int corePoolSize = 1;
 int maximumPoolSize = 2;
 int keepAliveTime = 10;
// BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();
 BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(5);
 ThreadFactory threadFactory = Executors.defaultThreadFactory();
 //线程池和队列满了之后的处理方式
 //1.跑出异常
 RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); 
 RejectedExecutionHandler handler2 = new ThreadPoolExecutor.CallerRunsPolicy();
 RejectedExecutionHandler handler3 = new ThreadPoolExecutor.DiscardPolicy();
 RejectedExecutionHandler handler4 = new ThreadPoolExecutor.DiscardOldestPolicy();

 
 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, handler2);
 
 
 for (int j = 1; j < 15; j++) {
  threadPoolExecutor.execute(new Runnable() {
  
  public void run() {
   
   try {
   System.out.println(Thread.currentThread().getName());
   TimeUnit.SECONDS.sleep(1);
   } catch (InterruptedException e) {
   e.printStackTrace();
   }
   
   
  }
  });
 }
 
 System.out.println(threadPoolExecutor);
 
 }


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# Java  # ThreadPoolExecutor参数理解  # ThreadPoolExecutor参数详解  # Java线程池的拒绝策略实现详解  # 详解什么是Java线程池的拒绝策略?  # Java线程池ThreadPoolExecutor原理及使用实例  # ThreadPoolExecutor线程池的使用方法  # 线程池ThreadPoolExecutor使用简介与方法实例  # Skywalking改成适配阿里云等带Http Basic的Elasticsearch服务  # 满了  # 都是  # 使用了  # 希望能  # 会把  # 谢谢大家  # 跑出  # 这三个  # 抛出  # 来写  # 数为  # 中取  # 新任务  # 直接调用  # return  # TimeUnit  # MILLISECONDS  # static  # public  # ExecutorService 


相关文章: 如何用虚拟主机快速搭建网站?详细步骤解析  如何在服务器上配置二级域名建站?  Android使用GridView实现日历的简单功能  香港服务器选型指南:免备案配置与高效建站方案解析  公司网站设计制作厂家,怎么创建自己的一个网站?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  微信小程序 五星评分(包括半颗星评分)实例代码  详解jQuery停止动画——stop()方法的使用  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  Python文件管理规范_工程实践说明【指导】  建站主机选择指南:服务器配置与SEO优化实战技巧  如何在阿里云完成域名注册与建站?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何高效完成独享虚拟主机建站?  网站制作公司,橙子建站是合法的吗?  天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?  如何基于云服务器快速搭建个人网站?  制作网页的网站有哪些,电脑上怎么做网页?  学校为何禁止电信移动建设网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  高防服务器租用指南:配置选择与快速部署攻略  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  *服务器网站为何频现安全漏洞?  建站之星2.7模板:企业网站建设与h5定制设计专题  如何获取免费开源的自助建站系统源码?  金*站制作公司有哪些,金华教育集团官网?  宿州网站制作公司兴策,安徽省低保查询网站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  招贴海报怎么做,什么是海报招贴?  网站制作网站,深圳做网站哪家比较好?  建站之星好吗?新手能否轻松上手建站?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  内部网站制作流程,如何建立公司内部网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  如何在VPS电脑上快速搭建网站?  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  建站主机是否等同于虚拟主机?  如何在橙子建站中快速调整背景颜色?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站之星备案是否影响网站上线时间?  如何通过服务器快速搭建网站?完整步骤解析  长沙做网站要多少钱,长沙国安网络怎么样?  如何用免费手机建站系统零基础打造专业网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。