并发编程之线程池
一、线程池简介
1.线程池状态
1)Running:运行中
2)ShuttingDown:关闭中
3)Termitnaed:已关闭
2.线程池是进程级的重量级资源。生命周期默认和JVM一致。
3.线程池优缺点 线程复用机制
1)降低系统资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2)提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
3)提高线程的可管理性。
二、线程池的接口
1.executor:void execute(Runnable) 启动线程任务。线程池顶级接口。唯一方法:execute()
调用者提供runnable接口的实现,线程池通过线程执行这个runnable。
2.executorService
void execute(Runnable)、Future submit(Callable)、Future submit(Runnable)。
3.Future:线程执行结束后的结果。
get():获取结果
4.Callable:可执行接口。有返回值和异常。
5.Executors
工具类型,为Executor线程池提供工具方法。可以快速提供几种线程池。
开始:创建线程池
结束:jvm关闭或调用shutdown并处理完所有任务。
三、四种线程池
1.FixedThreadPool:容量固定的线程池。推荐
1)BlockingQueue<Runnable>:任务队列。
当任务数量大于线程池容量时,没有运行的任务保存在任务队列中。
当有空闲线程时,自动从任务队列取出任务执行。
2)queued.tasks:任务队列。
completed.tasks:结束任务队列。计数
2.CachedThreadPool:缓存线程池。
1)自动扩容。
2)默认线程空闲60s自动销毁。
应用场景:内部或测试应用。
3.ScheduledThreadPool:计划任务线程池。
1)根据计划自动执行任务的线程池。定时完成任务。
2)阻塞式。
应用场景:计划任务时选用(DelaydQueue)。
4.SingleThreadExecutor:单一容量的线程池。
应用场景:保证任务顺序时选用。游戏中的喇叭,秒杀。
四、线程池面试问题
1.线程池工作流程 核心线程数 最大线程数 队列 拒绝策略等
简单总结下线程池之间的参数协作分为以下几步:
- 线程优先向 CorePool 中提交;
- 在 Corepool 满了之后,线程被提交到任务队列,等待线程池空闲;
- 在任务队列满了之后 corePool 还没有空闲,那么任务将被提交到 maxPool 中,如果 MaxPool 满了之后执行 task 拒绝策略。