首先说一下为什么用线程池,线程池有什么优点
1、提高资源利用率
线程池可以重复利用已经创建了的线程
2、提高响应速度
因为当线程池中的线程没有超过线程池的最大上限时,有的线程处于等待分配任务状态,当任务到来时,无需创建线程就能被执行。
3、具有可管理性
线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。
线程池的分类
在介绍分类之前,先说一下ThreadPoolExecutor 他是线程池的真正实现 他有四个构造 我们直接介绍最多的那个
1、FixedThreadPool
通过上面的构造方法方法可以看到 它是一种线程数量固定的线程池,当线程处于空闲状态也不会回收,当所有线程都处于活动状态时,新任务就会处于等待状态,直到有线程空闲出来。
【举个栗子】就像一堆人排队上公厕,可以无数多的人排队,但是公测位置就那么多,没人上时也不会拆。
由于线程不会回收,FixThreadPool会更快地响应外界请求,这也很容易理解,就好像有人突然想上厕所,公厕不是现用现建的。
2、CachedThreadPool
通过上面的构造方法可以看到 他是线程数量不等的线程池,只有非核心线程,并且数量很大,当有新的任务进来时,如果所有的线程都处于活动,就会创建一个新的线程,否则就用空闲线程来处理,超时时长60秒。
【举个栗子】CachedThreadPool就像是一堆人去一个很大的咖啡馆喝咖啡,里面服务员也很多,随时去,随时都可以喝到咖啡。但是为了响应国家的“光盘行动”,一个人喝剩下的咖啡会被保留60秒,供新来的客人使用。如果你运气好,没有剩下的咖啡,你会得到一杯新咖啡。但是以前客人剩下的咖啡超过60秒,就变质了,会被服务员回收掉。
比较适合执行大量的耗时较少的任务。喝咖啡人挺多的,喝的时间也不长。
3、ScheduledThreadPool
他的核心线程数量是固定的,非核心线程没有限制,当非核心线程闲置时会立即回收,这类线程主要用于执行定时任务和具有定时周期的任务。
4、SingleThreadExecutor
他只有一个核心线程,他的所有任务都在同一个线程中按顺序执行,并处理了线程同步问题
【举个栗子】有一个公厕,只有一个位置(这个位置是收费的,因为老大爷年纪大了,管理不了那么多),先来先上。