线程池应用及实现原理

为什么需要线程池

一.为什么需要线程池

线程是不是越多越好?

  • 线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行时间就很不合算。
  • java对象占用堆内存,操作系统线程系统内存,根据jvm规范,一个线程默认最大栈大小为1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。
  • 操作系统需要频繁切换线程上下文,影响性能。

线程池的推出,就是为了方便的控制线程数量。

二.线程池原理-概念

  1. 线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
  2. 工作线程:线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
  3. 工作接口:每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务入口,任务执行完成后的收尾工作,任务的执行状态等;
  4. 任务队列:用于存放没有处理的任务,提供一种缓冲机制;

线程池API-接口定义和实现类

类型 名称 描述
接口 Executor 最上层接口,定义了执行任务的方法execute
接口 ExecutorService 继承了Executor接口,拓展了Callable、Future、关闭方法
接口 ScheduledExecutorService 继承了ExecutorService,增加了定时任务相关的方法
实现类 ThreadPoolExecutor 基础标准的线程池实现
实现类 ScheduledThreadPoolExecuto 继承ThreadPoolExecutor,实现了ScheduledExecutorService中相关定时任务的方法

线程池API

线程池原理-任务execute过程

  1. 是否达到核心线程数量?没达到,创建一个工作线程来执行任务
  2. 工作队列是否已满?没满,则将新提交的任务存储在工作队列中
  3. 是否达到线程池最大数量?没达到,则创建一个新的工作线程来执行任务
  4. 最后,执行拒绝策略来处理这个任务

线程数量

计算型任务:CPU数量的1-2倍

IO型任务:相对比计算型任务,需要多一些线程,要根据具体的io阻塞时长进行考量决定。

如tomcat中默认的最大线程数为:200


   转载规则


《线程池应用及实现原理》 keyj 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
内存屏障和CPU缓存 内存屏障和CPU缓存
CPU性能优化手段-缓存一、CPU性能优化-缓存为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化。 例如:CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用缓存cache提高性能。 1、多级缓存L1 Ca
2019-06-18 keyj
下一篇 
线程封闭之Threadlocal和栈封闭 线程封闭之Threadlocal和栈封闭
线程封闭概念多线程访问共享可变数据时,涉及到线程间数据同步问题。并不是所有时候,都要用到共享数据,所以线程封闭概念就提出来了。 数据都 被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的技术称为线程封闭。 线程
2019-06-18 keyj
  目录