• ThreadPoolExecutor 定制线程池参数


    在 java 开发中经常需要执行一些“规格化”的任务,此时可以使用 java 线程池。节省创建线程时间,任务来时即可执行,高效。

    java 包是 java.util.concurrent 。创建线程池的常用方法

    Executors.newCachedThreadPool()
    Executors.newFixedThreadPool()
    Executors.newSingleThreadExecutor()
    Executors.newCachedThreadPool()

    使用线程池的优点

    1.重用存在的线程,减少对象创建、消亡的开销,性能佳。 
    2.可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 
    3.提供定时执行、定期执行、单线程、并发数控制等功能。

    线程池的重要类

    ExecutorService 
    真正的线程池接口。

    ScheduledExecutorService 
    能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

    ThreadPoolExecutor 
    ExecutorService的默认实现。

    ScheduledThreadPoolExecutor 
    继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

    如果对线程池有更细粒度的控制要求,可以使用 ThreadPoolExecutor完整的构造方法参数如下

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

    各个参数的含义如下

    • corePoolSize(线程池基本大小):当向线程池提交一个任务时,若线程池已创建的线程数小于corePoolSize,即便此时存在空闲线程,也会通过创建一个新线程来执行该任务,直到已创建的线程数大于或等于corePoolSize时,才会根据是否存在空闲线程,来决定是否需要创建新的线程。除了利用提交新任务来创建和启动线程(按需构造),也可以通过 prestartCoreThread() 或 prestartAllCoreThreads() 方法来提前启动线程池中的基本线程。
    • maximumPoolSize(线程池最大大小):线程池所允许的最大线程个数。当队列满了,且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程来执行任务。另外,对于无界队列,可忽略该参数。
    • keepAliveTime(线程存活保持时间):默认情况下,当线程池的线程个数多于corePoolSize时,线程的空闲时间超过keepAliveTime则会终止。但只要keepAliveTime大于0,allowCoreThreadTimeOut(boolean) 方法也可将此超时策略应用于核心线程。另外,也可以使用setKeepAliveTime()动态地更改参数。

    非核心线程闲置超时时长,超过该时间会销毁该线程

    • unit(存活时间的单位):时间单位,分为7类,从细到粗顺序:NANOSECONDS(纳秒),MICROSECONDS(微妙),MILLISECONDS(毫秒),SECONDS(秒),MINUTES(分),HOURS(小时),DAYS(天);
    • workQueue(任务队列):用于传输和保存等待执行任务的阻塞队列。当所有的核心线程都在干活时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务。可以使用此队列与线程池进行交互:

    • threadFactory(线程工厂):用于创建新线程。由同一个threadFactory创建的线程,属于同一个ThreadGroup,创建的线程优先级都为Thread.NORM_PRIORITY,以及是非守护进程状态。threadFactory创建的线程也是采用new Thread()方式,threadFactory创建的线程名都具有统一的风格:pool-m-thread-n(m为线程池的编号,n为线程池内的线程编号);
    • handler(线程饱和策略):当线程池和队列都满了,执行阻塞时执行该方法,表明该线程池已达饱和状态。
        ThreadPoolExecutor.AbortPolicy:处理程序遭到拒绝,则直接抛出运行时异常RejectedExecutionException。(默认策略)
        ThreadPoolExecutor.CallerRunsPolicy:调用者所在线程来运行该任务,此策略提供简单的反馈控制机制,能够减缓新任务的提交速度。
        ThreadPoolExecutor.DiscardPolicy:无法执行的任务将被丢弃。
        ThreadPoolExecutor.DiscardOldestPolicy:如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重新尝试执行任务(如果再次失败,则重复此过程)。

     说明:无界队列。对于使用无界队列时 maximumPoolSize 参数将没有意义,因为多余的任务会放到任务队列中。直到内存资源耗尽。

    参考文献:

    https://blog.csdn.net/z_s_z2016/article/details/81674893

    https://blog.csdn.net/wtopps/article/details/80682267

     https://blog.csdn.net/achuo/article/details/80623893

  • 相关阅读:
    java学习--基础知识进阶第十四天--xml文件的概述与应用场景、xml文件的组成部分&如何编写xml、xml的两种解析方式的原理、Dom4J开源工具的使用
    java学习--基础知识进阶第十三天--笔记
    java学习--基础知识进阶第十三天--反射机制的概述和字节码对象的获取方式、反射操作构造方法、成员方法、成员属性、JavaBean的概述&BeanUtils的使用、自定义BeanUtils工具类
    java学习--基础知识进阶第十二天--笔记
    java学习--基础知识进阶第十二天--网络编程概述、UDP协议、TCP协议
    java学习--基础知识进阶第十一天--多线程概述、线程实现、多线程安全问题产生 & 解决方案
    杭电oj 1000
    建立消息映射和消息处理
    c程序设计语言 导言
    句柄数不停增加
  • 原文地址:https://www.cnblogs.com/zhaopengcheng/p/11113749.html
Copyright © 2020-2023  润新知