1. 优点:
(1) 提高资源利用率,线程池可以重复利用已经创建了的线程。(2) 提高响应速度,当线程池中线程数量没有超过最大上限的时候,有些线程出于等待分配任务状态,当任务来到时,可以直接执行,无需创建操作。(3) 具有可管理性,减少频繁创建销毁线程带来的系统开销。
2. 分类:
(1) FixedThreadPool
这个实例会复用固定数量的线程处理一个共享的无边界队列,任何时间点,会有最多固定数量的线程出于活动状态,当所有线程都处于活动状态时,当有新的任务提交过来,会在队列中排队,知道有线程空闲。如果有任何线程在执行任务过程中出现错误终止,新的线程会继续执行其剩余的任务。所有线程会一直存在于线程池中,直到显示的执行 ExecutorService.shutdown() 关闭。
(2) CacheThreadPool
它是线程数量不等的线程池,只有非核心线程,并且数量很大,当有新任务进来时,如果所有线程都处于活动状态,则新创建线程执行任务并放到线程池中,否则则使用空闲状态的线程执行任务。当线程处于空闲状态 60s 后,则会被中止并从缓存中移除。因此,线程池在长时间空闲后不会消耗任何资源。
(3)SingleThreadPool
它只有一个核心线程,它的所有任务都在同一个线程中按顺序执行,并处理了线程同步问题。如果单个线程在执行任务过程中出现错误中止,则会有新的线程代替执行后续的任务。任何时候都不会多于一个线程处于活动状态。
(4) ScheduledThreadPool
它的核心线程数量是固定的,非核心线程数量没有限制,当非核心线程闲置时,会立即回收。这类线程主要用于执行定时任务和具有定时周期的任务。
FixedThreadPool 与 CachedThreadPool 特性对比
特性 | FixedThreadPool | CachedThreadPool |
---|---|---|
重用 | FixedThreadPool 与 CacheThreadPool差不多,也是能 reuse 就用,但不能随时建新的线程 | 缓存型池子,先查看池中有没有以前建立的线程,如果有,就 reuse ;如果没有,就建一个新的线程加入池中 |
池大小 | 可指定 nThreads,固定数量 | 可增长,最大值 Integer.MAX_VALUE |
队列大小 | 无限制 | 无限制 |
超时 | 无 IDLE | 默认 60 秒 IDLE |
使用场景 | 所以 FixedThreadPool 多数针对一些很稳定很固定的正规并发线程,多用于服务器 | 大量短生命周期的异步任务 |
结束 | 不会自动销毁 | 注意,放入 CachedThreadPool 的线程不必担心其结束,超过 TIMEOUT 不活动,其会自动被终止。 |