以下内容整理自互联网,仅用于个人学习
线程池基础
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,
sPoolWorkQueue,sThreadFactory
);
当一个任务加入到线程池时:
- 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
- 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
- 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
- 当线程池中的线程数量大于 corePoolSize时,如果某线程(非核心线程)空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
处理任务的优先级
- 核心线程corePoolSize
- 任务队列workQueue
- 最大线程maximumPoolSize
如果三者都满了,使用handler处理被拒绝的任务(一般为抛出java.util.concurrent.RejectedExecutionException异常)
线程类型
- FixedThreadPool:线程数量固定的线程池,线程处于空闲状态时不会被回收,除非线程被关闭。当所有线程都处于活动状态时,新的任务都会处于等待状态,直到有线程空闲出来。
- CachedThreadPool:线程数量不固定,只有非核心线程,可以放任意多个线程(Integer.MAX_VALUE),线程池里所有线程处于活动状态时,创建新的线程处理新来的任务。否则利用闲置的线程处理新任务。线程池里空闲线程有超时机制,时长为60秒。
- ScheduledThreadPool:核心线程数量是固定的,非核心线程是没有限制。当非核心线程闲置时会被立即回收。
- SingleThreadExector:内部只有一个核心线程,确保所有任务在同一个线程中按顺序执行。
线程池的优点
- 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销
- 能有效控制线程池的最大并发数,避免大量线程之间因互相抢占系统资源而导致阻塞。
- 能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。
网友评论