Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f6ac89a

Browse files
Update java线程池学习总结.md
1 parent e3d1c97 commit f6ac89a

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

‎docs/java/multi-thread/java线程池学习总结.md‎

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
## 一 使用线程池的好处
32

43
> **池化技术想必大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。**
@@ -302,7 +301,7 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
302301
```java
303302
// 存放线程池的运行状态 (runState) 和线程池内有效线程的数量 (workerCount)
304303
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
305-
304+
306305
private static int workerCountOf(int c) {
307306
return c & CAPACITY;
308307
}
@@ -346,9 +345,7 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
346345

347346
![图解线程池实现原理](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/javaguide/%E5%9B%BE%E8%A7%A3%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.png)
348347

349-
350-
351-
**`addWorker` 这个方法主要用来创建新的工作线程,如果返回true说明创建和启动工作线程成功,否则的话返回的就是false。**
348+
**`addWorker` 这个方法主要用来创建新的工作线程,如果返回 true 说明创建和启动工作线程成功,否则的话返回的就是 false。**
352349

353350
```java
354351
// 全局锁,并发操作必备
@@ -388,15 +385,15 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
388385
for (;;) {
389386
//获取线程池中线程的数量
390387
int wc = workerCountOf(c);
391-
// core参数为true的话表明队列也满了,线程池大小变为 maximumPoolSize
388+
// core参数为true的话表明队列也满了,线程池大小变为 maximumPoolSize
392389
if (wc >= CAPACITY ||
393390
wc >= (core ? corePoolSize : maximumPoolSize))
394391
return false;
395392
//原子操作将workcount的数量加1
396393
if (compareAndIncrementWorkerCount(c))
397394
break retry;
398395
// 如果线程的状态改变了就再次执行上述操作
399-
c = ctl.get();
396+
c = ctl.get();
400397
if (runStateOf(c) != rs)
401398
continue retry;
402399
// else CAS failed due to workerCount change; retry inner loop
@@ -408,7 +405,7 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
408405
boolean workerAdded = false;
409406
Worker w = null;
410407
try {
411-
408+
412409
w = new Worker(firstTask);
413410
final Thread t = w.thread;
414411
if (t != null) {
@@ -453,13 +450,13 @@ pool-1-thread-2 End. Time = Sun Apr 12 11:14:47 CST 2020
453450
}
454451
```
455452

456-
更多关于线程池源码分析的内容推荐这篇文章:《[JUC线程池ThreadPoolExecutor源码分析](http://www.throwable.club/2019/07/15/java-concurrency-thread-pool-executor/)
453+
更多关于线程池源码分析的内容推荐这篇文章:《[JUC 线程池 ThreadPoolExecutor 源码分析](http://www.throwable.club/2019/07/15/java-concurrency-thread-pool-executor/)
457454

458455
现在,让我们在回到 4.1 节我们写的 Demo, 现在应该是不是很容易就可以搞懂它的原理了呢?
459456

460457
没搞懂的话,也没关系,可以看看我的分析:
461458

462-
> 我们在代码中模拟了 10 个任务,我们配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中去。当前的5个任务中如果有任务被执行完了,线程池就会去拿新的任务执行。
459+
> 我们在代码中模拟了 10 个任务,我们配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中去。当前的 5 个任务中如果有任务被执行完了,线程池就会去拿新的任务执行。
463460
464461
### 4.3 几个常见的对比
465462

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /