简单理解多线程、线程池与队列设置

非技术指导性文章,用简单的例子描述下什么是多线程以及队列
一般一个多线程任务设置会涉及到如下专业名词:
核心线程数
最大线程数
队列长度
还有个不太常用到的拒绝策略
例子:
假设有一个银行,这个银行就是一个业务进程。
1、最开始没有银行,只有一个小桌子,做了一个经理,所有来办理业务的人都只能在他这,等他办完前一个才能处理下一个
2、后来发现办理太慢,决定盖一个银行,招一些人
3、银行里有一些职员,还有一些业务窗口,其中一些是正式窗口,就是一直开放的,一些是临时窗口。
4、当有用户来办理业务时,经理首先看正式窗口是不是空闲,如果空闲就让他直接去办理,不空闲的话,在看下能不能开临时窗口,如果能开就去临时窗口,如果临时窗口也满了,就给他排队取号。
5、因为银行的空间是有限的,所以排队的人数也是有限制的的。
6、当排队的人数达到了最大限制,就需要经理来选择怎么做,是直接告诉他回去,还是经理自己帮他办理,当经理帮他办理时,就回到了最开始阶段,后面的人就只能经理处理完当前的人的业务,再去处理下一个。
在上文中:
客户就是要消费的任务,经理就是主进程
最开始时只有经理,是单线程
当有了银行时,就是一个线程池:职员就是CPU,正式窗口就是核心线程,正式+临时窗口就是最大线程,队列长度就是排队限制
当一个用户在办理业务时,他有可能需要填写一些东西(IO),当他填东西时,可以认为职员(CPU)是在等待他填完,这个时候他就可以去其他窗口处理其他人的业务(CPU调度)。也就是说窗口其实可以比职员多的,但是太多也没有意义,因为一个人不可能顾得上200个窗口。
对于6就是队列满的时候的拒绝策略,一般默认的策略是主进程自己处理,那就是这个经理处理,同时整个业务阻塞,也就是整个银行入口都卡住。