什么是线程池?
线程池就像一个“工人池塘”,里面有很多工人(线程)。当有任务需要处理时,我们就从池塘里取出一个工人来做事。做完事后,工人不会被解雇,而是回到池塘里等待下一个任务。这么做的好处是不用每次有任务都新雇一个工人,这样可以节省创建和销毁工人的时间和资源。
线程池是如何工作的?
- 初始化线程池:一开始,池塘里会放入一定数量的工人(线程)。
- 提交任务:当有任务需要处理时,任务会被提交到线程池。
- 分配任务:线程池会从池塘里取出一个空闲的工人,分配任务给他。
- 执行任务:工人开始执行任务。
- 完成任务:任务完成后,工人不会离开,而是回到池塘里,等待下一个任务。
配置线程池
配置线程池就像管理一个工厂,你需要决定池塘里放多少工人,还要考虑各种情况,比如高峰期和低谷期。
- 核心线程数:这是池塘里一直保持的最少工人数。即使没有任务,这些工人也不会被解雇。
- 最大线程数:这是池塘里最多能放多少工人。当任务很多时,池塘里可以临时增加工人,但不会超过这个数。
- 空闲时间:当工人完成任务后,如果超过这个时间还没有新的任务,他们会被解雇,直到只剩下核心线程数的工人为止。
- 任务队列:当所有工人都在忙的时候,新任务会被放到一个队列里等待。可以想象成一个待办事项清单。
- 拒绝策略:当任务队列也满了,新任务无法再提交时,线程池会有一个策略来决定如何处理这些任务,比如抛出异常、丢弃任务等。
举个例子
假设你有一个餐馆,厨房里有几个厨师(线程)。你可以这样配置:
- 核心线程数:3个厨师(即使没有顾客也要保持3个厨师在岗)。
- 最大线程数:10个厨师(最多只能雇10个厨师)。
- 空闲时间:10分钟(如果一个厨师10分钟都没活干,就让他下班)。
- 任务队列:20个订单(如果所有厨师都在忙,新订单会排队)。
- 拒绝策略:如果订单队列也满了,直接告诉顾客不接单了。
这样配置后,当顾客多的时候,你会临时增加厨师来应对高峰期;当顾客少的时候,你会减少厨师,节省成本。