zoukankan      html  css  js  c++  java
  • ThreadPoolExecutor详解

    ThreadPoolExecutor 详解

    一、概述 


    1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; 
    2、Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。 
    3、先来了解其线程池管理的机制,有助于正确使用,避免错误使用导致严重故障。同时可以根据自己的需求实现自己的线程池 
     

    二、ThreadPoolExecutor的实现

        public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  RejectedExecutionHandler handler) 
     
    核心构造方法讲解 

    下面是ThreadPoolExecutor最核心的构造方法
     
    参数名 作用
    corePoolSize 核心线程池大小
    maximumPoolSize 最大线程池大小
    keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;可以allowCoreThreadTimeOut(true)使得核心线程有效时间
    TimeUnit keepAliveTime时间单位
    workQueue 阻塞任务队列
    threadFactory 新建线程工厂
    RejectedExecutionHandler 当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理


    corePoolSize,maximumPoolSize,workQueue之间关系

    1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
    2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
    3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
    4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
    5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
    6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭

     可以用一下图解直观的表示

    RejectedExecutionHandler四种策略

    作用:当这个阻塞队列满了的时候,会出现两种情况

    正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;

    正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会通过一个策略进行对后续的任务进行处理。

    策略 说明
    ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常 
    ThreadPoolExecutor.CallerRunsPolicy()  重试添加当前的任务,他会自动重复调用execute()方法 
    ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务 
    ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务 
  • 相关阅读:
    Load a properties file Real's Java Howto
    [nodejs]保证你的程序死了还能复活:forever and forever webui MK2 博客园
    为嵌入式系统开发软件和为高性能计算或大型分布式平台开发软件,二者需要的技能在很大称度上相同,我不是第一个发现这一点的人。
    HTTP Range说明 lenoval的专栏 博客频道 CSDN.NET
    『NodeJS』简单的本地 DNS 代理脚本
    Automation | Coyote Point Systems
    Java 高层网络编程
    SQL 语句大全
    浅谈AVG游戏中的脚本
    How to debug Bluetooth
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/10616531.html
Copyright © 2011-2022 走看看