线程池的使用和底层实现

来源:互联网 发布:宋朝士大夫 知乎 编辑:程序博客网 时间:2024/06/06 13:22

今天给大家带来的是线程池的学习和使用,同时记录并分享对这个技术点的运用。

什么是线程池

线程池是一种多线程处理的形式,通过把处理的任务添加到队列中,然后在创建线程后自动执行这些任务。线程池可以同时执行多个任务,如果任务队列已经满了,则新来的任务就会排队等待,线程池线程的数量永远不会大于既定最大值。

线程池的优点

  • 线程池的重用使得我们不用为重复创建线程和销毁线程带来的性能开销而头疼。
  • 线程池对线程数量是可控的,这就有效控制了大量线程之间相互抢夺资源造成的系统资源堵塞。
  • 线程池对线程的有效管理,提高线程的利用率和让线程拥有一些简单的功能。
  • 线程池能出色完成工作量大,时间短的任务。

线程池的参数

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:非核心线程闲置时的超时时长,超过这个时长会被回收,如果核心线程.allowCoreThreadTimeOut设置成了true,那么核心线程在闲置的情况下,也会被回收
unit:超时的时间单位
workQueue:线程池中的任务队列,通过execute方法提交的runnable对象会存储在该队列中

从上面的参数就可以看出,线程池使用起来并不难,常用的参数也是这么几种,基本上掌握常用的参数能够满足大多数工作了。也可以根据自己项目的实际需求,对线程池进行个性化的定制,下面说说系统常用的4种线程池的实现原理。
1.newFixedThreadPool()
这里写图片描述
固定线程数量的线程池,线程处于空闲时也不会被回收。这种线程池里只含有核心线程,也就意味着不会被系统回收,同时只要一有任务,newfixedthreadpool就会更加快速的去响应。
2.newCachedThreadPool()
这里写图片描述
没有核心线程,不固定线程的数量,超时时长60秒,超过后会被回收,所以它的特性在空闲时,没有线程几乎是不占用内存的,适用于多量耗时少的任务。
3.newScheduledThreadPool(int corePoolSize)
这里写图片描述
固定核心线程,主要用于定时任务或者周期性任务。
4.newSingleThreadExecutor()
这里写图片描述
把所有任务统一在一个核心线程中顺序执行。
以上4种都是通过Executors 下面对应类型的方法来创建。