我希望通过故事的方式尝试和大家说说线程池
【我要开店了,老爸是土豪,老爸给了一些他自己的元老给我用】
老爸就是jvm,店铺就是一个线程池,员工就是一个线程,顾客就是要执行的方法。
ThreadPoolExecutor 的参数
int corePoolSize,最少的核心线程数,(老爸最开始给的员工,说白了就是元老,用来保命的,打死也不能炒的,除非关店了)
int maximumPoolSize,(公司最多可以去到多少人)
long keepAliveTime,(公司里面除了元老,还可以招聘员工,但是都是合同工,用完要还的,还的时间)
TimeUnit unit,(公司里面除了员工,其他都是合同工,用完要还的,还的时间单位)
BlockingQueue<Runnable> workQueue,(开店的流量)
BlockingQueue一定是先进先出的,先来的客户我们先服务。
ArrayBlockingQueue (有界,一时间只能进来多少个客人,超过了就等下)
LinkedBlockingQueue (默认无界,也可配置,一时间能进来多少个客人,超过了就等下,你店够大能吃得下也问题不大。)
RejectedExecutionHandler handler(超出流量时,我们怎么办?)
JDK内置了四种拒绝策略:
1、AbortPolicy策略(有问题就出错,新来的客户就不让进,让他闹事)
该策略直接抛出异常,阻止系统工作
2、CallerRunsPolicy策略(打死我也不放弃,除非店关了)
只要线程池未关闭,该策略直接在调用者线程中运行当前被丢弃的任务。显然这样不会真的丢弃任务,但是,调用者线程性能可能急剧下降。
3、DiscardOledestPolicy策略(打跑老客户,自己进店)
丢弃最老的一个请求任务,也就是丢弃一个即将被执行的任务,并尝试再次提交当前任务。
4、DiscardPolicy策略(人这么多,自己不进去了,默默离开)
默默的丢弃无法处理的任务,不予任何处理。
在ThreadPoolExecutor创建时,尽量使用AbortPolicy策略
另外需要根据场景是否使用无界队列。
网友评论