线程池详解

线程池

是一种基于池化思想管理线程的工具。

优点

  • 降低资源消耗
  • 提高响应速度
  • 提高线程的管理性

创建ThreadPoolExecutor

java 复制代码
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
  1. corePoolSize:核心线程数,线程池初始化时默认是没有线程的,当任务来临时才开始创建线程去执 行任务
  2. maximumPoolSize:最大线程数,在核心线程数已满,且队列已满时,如果池子里的工作线程数小于maximumPoolSize,则会创建非核心线程执行任务
  3. keepAliveTime:非核心线程数的空闲时间超过keepAliveTime就会被自动终止回收掉,但在corePoolSize=maximumPoolSize时,该值无效,因为不存在非核心线程
  4. unit:keepAliveTime的时间单位
  5. workQueue:用于保存线程任务的队列,主要分为无界、有界、同步移交等队列,当池子里的工作线程数大于corePoolSize,就会将新进来的线程任务放入队列中
    1)ArrayBlockingQueue(有界队列):队列长度有限,当队列满了就需要创建非核心线程执行任务,如果最大线程数已满,则执行拒绝策略 
    2)LinkedBlockingQueue(无界队列):队列长度无限,当任务处理速度跟不上任务创建速度,可能会导致内存占用过多或OOM
    3)SynchronousQueue(同步队列):队列不作为任务的缓冲处理,队列长度为0
  6. threadFactory:创建线程的工厂接口,默认使用Executors.defaultThreadFactory();另外可以实现ThreadFactory接口,自定义线程工厂
  7. handler:线程池无法继续接收任务时(workQueue已满和maximumPoolSize已满)的拒绝策略
    1)AbortPolicy:默认拒绝策略,中断抛出RejectedExecutionException异常
    2)CallerRunsPolicy:让提交任务的主线程来执行任务
    3)DiscardOldestPolicy:丢弃在队列中存在时间最久的任务,重复执行
    4)DiscardPolicy:丢弃任务,不进行任何通知
    5)另外可以实现RejectedExecutionHandler接口,自定义拒绝策略

提交任务

  • 无返回值的任务使用 public void execute(Runnable command) 方法提交;
  • 有返回值的任务使用:
    Future<?> submit(Runnable task) : 提交Runnable任务
    Future submit(Runnable task, T result): 提交Runnable任务并指定执行结果
    Future submit(Callable task) : 提交Callable任务
相关推荐
张小洛16 分钟前
Spring 常用类深度剖析(工具篇 04):CollectionUtils 与 Stream API 的对比与融合
java·后端·spring·spring工具类·spring utils·spring 类解析
一 乐38 分钟前
房产租赁管理|基于springboot + vue房产租赁管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·房产租赁管理系统
xieliyu.43 分钟前
Java顺序表实现扑克牌Fisher-Yates 洗牌算法
java·数据结构·算法·javase
YanDDDeat1 小时前
【Spring】事务注解失效与传播机制
java·后端·spring
SamDeepThinking1 小时前
学数据结构到底有什么用
java·后端·面试
Xiu Yan1 小时前
Java 转 C++ 系列:函数模板
java·开发语言·c++
程序员清风1 小时前
独立开发者必看:推荐几个可直接用的开源项目!
java·后端·面试
YJlio1 小时前
4月14日热点新闻解读:从金融数据到平台治理,一文看懂今天最值得关注的6个信号
java·前端·人工智能·金融·eclipse·电脑·eixv3
落魄江湖行1 小时前
基础篇三 一行 new String(“hello“) 到底创建了几个对象?90% 的人答错了
java·面试·八股文
青衫码上行1 小时前
【从零开始学习JVM】栈中存的是指针还是对象 + 堆分为哪几部分
java·jvm·学习·面试