6回复
4年前
线程池内部进行任务隔离
最近优化线程池的参数,想到之前看到一篇博客,博主给了一个场景。
背景:
他们发现项目中有个任务占用了线程池的大部分线程资源,导致其他业务出现异常情况。
期望:
他们想限制指定任务的线程数。例如池中有1000个线程,只给指定任务10个线程去处理。这个应该如何实现…
当时心里犯嘀咕,这…难道不应该单独开个池子吗?
博主的处理:
印象很深博主说,他们用了Semaphore来做这个限制。(很久看的了,找不到文章问他们是怎么做的)
思考:
撇开是否另开池子做业务隔离不说,顺着博主的思路,Semaphore如何配合线程池做任务线程数限制呢?
- 如果是在任务内部做acquire及release,或者做availablePermits检查。应该是不合理的,这只能保证同一时间段最多N个拿到指定任务的线程处于Running状态。其他分配到任务,但是acquire申请失败的线程会一直阻塞,虽然没在跑,但占着茅坑不拉粑粑。而线程领取任务的动作是由池子框架层完成的,这个无法进行干预。所以很疑惑…
3772 阅读