1.为什么要用线程池
降低资源消耗:通过复用线程,降低创建和销毁线程的损耗。
提高响应速度:任务不需要等待线程创建就能立即执行。
提高线程的可管理性:使用线程池可以进行统一的分配、调优和监控。
2. 线程池执行流程(原理)
ThreadPoolExecutor的执行流程(原理)
如果核心线程池没满,就创建新线程来处理任务。
如果核心线程池满了,就将任务加入到阻塞队列。
如果阻塞队列满了,就创建临时线程来处理任务。
如果线程池满了,任务将被拒绝,并按照拒绝策略来处理。
模拟 10 个任务,配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中。当前的 5 个任务执行完成后,才会执行剩下的 5 个任务。
面试题: 现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为 5 :
Q:有4个任务同时进来,问:线程池会创建几条线程?
A:执行execute方法会新建 4 条线程来执行任务;
Q:又同时进来 2 个任务呢(总共6个任务了)?
A:会新建 1 条线程来执行任务,这时核心线程池满了,但还剩下1个任务,线程池会将剩下这个任务放进阻塞队列中,等待空闲线程执行。
Q:又同时进来了 5 个任务呢(总共11个任务了)?