几种场景:
- 新的线程来了
1)先看,池子里面的线程,如果小于 coresize, 则新建。 这个时候。不管有不有空闲的线程,都是新建。
也就是 新建优先。
2)如果 等于 coresize, 则加入到 queue 里面。 加入到queue里面。等待空闲线程的调度。
3) 如果很多任务都来了,都加入queueu。这个queue 有不有界限?
这里分为有界队列和无界队列。
对于有界队列,比如50. 这里最多可以缓存50个 任务。
如果到达了50个任务之后。 还没有空闲的 core thread。这个时候。要看另外一个 maxSize 参数。
如果maxSize > coresize, 这里就会 新建临时的 thread 去处理任务。 直到 达到 了 maxSize的上线。
如果还有更多任务进来,打满了 queue。 就报错了。
记住这个max size 里面的thread 是临时的。 设置keep alive 可以方便的回收这些thread。
另外 core 的thread 默认不回收,但是也可以设置相应的参数。允许回收。
另外就是 无界队列。 对于无界队列。 就是queque不会满, 会耗光所有的资源啊。
这个时候。maxsize 也就是无效的。
在使用 threadpool的时候。 通常需要考虑 生产者和消费者的速度差异。
需要控制queue的大小。
网友评论