线程池任务调度机制 -- 打电话预定酒店房间的例子
小明最近打算出去玩,需要预定酒店。小明心想多久都没出来玩了,这次奢侈一把,定个好点的房间吧。于是,拿起电话打给酒店前台客服,
小明:你好,请问是XX酒店吗?我想定一个总统套房。
前台:您好,好的,我先帮您看下还有没有总统套房,请您先稍等一下。
小明:好的。
前台:您好,很抱歉,由于最近是假期,今天的总统套房都已经被定满了,明天可能会有空房哦。您那边是打算什么时候入住呢?
小明:刚好是明天要入住,但是呢,因为最近人很多,都在定酒店。所以前台小姐姐帮我看下明天预约总统套房的人数是多少,预约人数有没有满。
前台:好的,这边帮您查看一下预约人数刚好是总统套房的间数,也就是20个。虽说现在预约数已经满了,但是会有人中途撤销预约的哦,您那边要不要再考虑一下?
小明:感觉有点子冒险,我还是再想想吧,那其他套房还有剩余的吗?
前台:有的,有的,先生,这边有三个普通大套房,也是很不错的,设备都很齐全,我可以给您安排一间环境最好的。
小明:那好吧,也只能先这样了,那你帮我订一间环境好点的大套房吧。
前台:嗯嗯,好的。这边请您留一下您的手机号码,我这边马上给您预定登记。
小明:电话号码是XXXXXX。
上面的例子中,线程池最大的线程数量就是这个酒店的全部房间数。总统套房,就好比是核心线程数
(核心,最重要的也是最尊贵的不就是总统套房嘛,哈哈哈)。总统套房的预约人数,就好比是任务队列。
如果有总统套房或者大套房, 则直接拎包入住,也就是直接创建新线程执行任务。如果考虑继续预约总统套房,类似进入任务队列进行等待。
如果房间全部爆满或者预约爆满,前台为了保证收益让小明考虑一下。小明肯定直接不考虑,直接走拒绝策略,说不好意思,不考虑贵店了,结束流程。
如果酒店不再营业了的情况也是和上面一样。
具体看下面的图:
线程池状态 举一个游乐场排队的例子
游乐场的人往往都会有很多,一群人在那排队等一个游玩项目
正常的情况,机器运行正常,游乐场的营业正常,属于运行Running状态
检票员每次检票放人进去的时候,达到一定人数后会关闭通道路口,不允许人进去,可以看成是一个shutdown的状态(关闭通道的操作)
如果在玩的时候发现了机器出现故障,就会紧急停止项目。可以看成是一个stop的状态
将进入的游客或正在玩的游客依次安排出去,如果有游客卡在机器上,就叫救护车来帮忙解救,这个过程其实就是 tidying ,表示正在整理(解救)的动作
当机器最终停止,人群疏散开并且解救完人之后。游乐场立马进行维修,那么最终会先停业,避免再次出事故,对应着线程中的 TERMINATED 状态
Running 可以直接到 stop ,比如说,游乐场刚开业,就被举报说设备安全系数不够,市场局的人来查封,
接着开始进入调查和营业整顿(tidying)的环节,最终只能停业 TERMINATED
可以看下面的图:
ThreadPoolExecutor线程池有如下几种状态:
- RUNNING:运行状态,接受新任务,持续处理任务队列里的任务;
- SHUTDOWN:不再接受新任务,但要处理任务队列里的任务;
- STOP:不再接受新任务,不再处理任务队列里的任务,中断正在进行中的任务;
- TIDYING:表示线程池正在停止运作,中止所有任务,销毁所有工作线程,当线程池执行terminated()方法时进入TIDYING状态;
- TERMINATED:表示线程池已停止运作,所有工作线程已被销毁,所有任务已被清空或执行完毕,terminated()方法执行完成;