|
26 | 26 |
|
27 | 27 | 注意:**下面三个任务可能做的是同一件事情,也可能是不一样的事情。**
|
28 | 28 |
|
29 |
| - |
| 29 | + |
30 | 30 |
|
31 | 31 | ### 如何使用线程池?
|
32 | 32 |
|
@@ -147,7 +147,7 @@ Finished all threads
|
147 | 147 |
|
148 | 148 | 除此之外,我们还可以利用 `ThreadPoolExecutor` 的相关 API做一个简陋的监控。从下图可以看出, `ThreadPoolExecutor`提供了获取线程池当前的线程数和活跃线程数、已经执行完成的任务数、正在排队中的任务数等等。
|
149 | 149 |
|
150 |
| - |
| 150 | + |
151 | 151 |
|
152 | 152 | 下面是一个简单的 Demo。`printThreadPoolStatus()`会每隔一秒打印出线程池的线程数、活跃线程数、完成的任务数、以及队列中的任务数。
|
153 | 153 |
|
@@ -178,7 +178,7 @@ Finished all threads
|
178 | 178 |
|
179 | 179 | **我们再来看一个真实的事故案例!** (本案例来源自:[《线程池运用不当的一次线上事故》](https://club.perfma.com/article/646639) ,很精彩的一个案例)
|
180 | 180 |
|
181 |
| - |
| 181 | + |
182 | 182 |
|
183 | 183 | 上面的代码可能会存在死锁的情况,为什么呢?画个图给大家捋一捋。
|
184 | 184 |
|
@@ -289,15 +289,15 @@ CPU 密集型简单理解就是利用 CPU 计算能力的任务比如你在内
|
289 | 289 |
|
290 | 290 | **如何支持参数动态配置?** 且看 `ThreadPoolExecutor` 提供的下面这些方法。
|
291 | 291 |
|
292 |
| - |
| 292 | + |
293 | 293 |
|
294 | 294 | 格外需要注意的是`corePoolSize`, 程序运行期间的时候,我们调用 `setCorePoolSize() `这个方法的话,线程池会首先判断当前工作线程数是否大于`corePoolSize`,如果大于的话就会回收工作线程。
|
295 | 295 |
|
296 | 296 | 另外,你也看到了上面并没有动态指定队列长度的方法,美团的方式是自定义了一个叫做 `ResizableCapacityLinkedBlockIngQueue` 的队列(主要就是把`LinkedBlockingQueue`的capacity 字段的final关键字修饰给去掉了,让它变为可变的)。
|
297 | 297 |
|
298 | 298 | 最终实现的可动态修改线程池参数效果如下。👏👏👏
|
299 | 299 |
|
300 |
| - |
| 300 | + |
301 | 301 |
|
302 | 302 | 还没看够?推荐 why神的[《如何设置线程池参数?美团给出了一个让面试官虎躯一震的回答。》](https://mp.weixin.qq.com/s/9HLuPcoWmTqAeFKa1kj-_A)这篇文章,深度剖析,很不错哦!
|
303 | 303 |
|
|
0 commit comments