• ThreadPoolExecutor详解


    转自:https://blog.csdn.net/qq_36071795/article/details/83932415

    第四个构造器源码

     

    corePoolSize:核心池的大小

    默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数数目少于corePoolSize时,有新任务进来就新建一个线程,即使有的线程没事干,当线程池中的线程数目达到corePoolSize时,将到达的任务放在缓存队列中

    可以理解为:队列没满时,线程最大并发数

    maximumPoolSize:线程池最多线程数

    表示在线程池中最多能创建多少个线程

    可以理解为:队列满后,线程能够达到的最大并发数

    keepAliveTime:空闲线程过多久被回收的时间限制

    默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize

    unit:keepAliveTime的时间单位

    workQueue:阻塞队列,用来存放待执行的任务

    工作队列的默认选项是 SynchronousQueue,它将任务直接提交给线程而不保持它们。在此,如果不存在可用于立即运行任务的线程,则试图把任务加入队列将失败,因此会构造一个新的线程。此策略可以避免在处理可能具有内部依赖性的请求集时出现锁。直接提交通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务。

    ArrayBlockingQueue(有界队列,基于数组,先进先出)

     

    LinkedBlockingQueue(无界队列,基于链表,先进先出)

     

    threadFactory:线程工厂,用来创建新线程

    handler:饱和策略

    当队列和线程池都满了(也就是说超过了maximumPoolSiz和workQueue),说明线程池处于饱和状态,那么必须采用一种策略来处理新任务

     

    当然也可以根据具体场景需要实现RejectedExecutionHandler接口来自定义策略,如记录日志或持久化不能处理的任务

    构造器的使用

     

    newSingleThreadExecutor-->单线程线程池

     

    newFixedThreadExecutor(n)-->固定数量线程池

     

    newCacheThreadExecutor(推荐使用)-->缓存线程池

     

    newScheduleThreadExecutor

    大小无限制的线程池,支持定时和周期性的执行线程

    常用方法之向线程池提交任务

    提交不需要返回值的任务

    提交需要返回值的任务

    常用方法之关闭线程池

     

  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/sharpest/p/10576371.html
Copyright © 2020-2023  润新知