谈谈线程池的理解。
答:线程池是一种池化技术,将线程存放在线程池中并处于等待状态,当出现任务需要执行时,则调用线程池中的线程执行任务,线程不足时会让任务等待,或者创建新的线程。当任务结束时,大于核心线程的线程数将会在超过KeepAlive时间后回收。
线程池的核心参数。
答:核心线程数(CorePoolSize),最大线程数(maximumPoolSize),非核心线程的存活时间(KeepAliveTime),时间单位(TimeUnit),阻塞队列(BlockingQueue),拒绝策略(RejectExecutionHandler),线程工厂(ThreadFactory)
线程池运行过程。
提交任务,分配空闲线程
若不存在空闲线程 则判断存活线程是否小于核心线程
若小于核心线程 则创建一个线程并分配 若不小于则线程已满,判断工作队列
若工作队列不满 则放入工作队列中排队并等待调用,若满则判断当前线程是否到达最大线程
若未到达最大线程 则创建新非核心线程 若到达则采用拒绝策略
常见线程池有哪些以及使用场景?
FixedThreadPool(线程数固定的线程池)
即适用执行长期的任务。
CachedThreadPool(线程数根据需要动态变换的线程池)
用于并发执行大量短期的小任务。
SingleThreadExecutor(仅允许单线程的线程池)
适用于串行执行任务的场景,将任务按顺序执行。
ScheduledThreadPool(可以定时周期性执行任务的线程池)
周期性执行任务,并且需要限制线程数量的需求场景。
为什么要使用线程池?
1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理。