Skip to content

Commit 9e82309

Browse files
committed
修改增加 mermaid 图 Mq-b#22 增加线程池描述 Mq-b#12
1 parent 86bd06e commit 9e82309

File tree

1 file changed

+55
-1
lines changed

1 file changed

+55
-1
lines changed

md/详细分析/04线程池.md

+55-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,61 @@
1010

1111
****”?水池装着水,线程池则是装着线程,是一种抽象的指代。
1212

13-
抽象的来说,可以当做是一个池子中存放了一堆线程,故称作线程池。简而言之,线程池是指代一组**预先创建的****可以复用的线程集合**。这些线程由线程池管理,用于执行多个任务而**无需频繁地创建和销毁**线程。
13+
抽象的来说,可以当做是一个池子中存放了一堆线程,**故称作线程池**。简而言之,线程池是指代一组**预先创建的****可以复用的线程集合**。这些线程由线程池管理,用于执行多个任务而**无需频繁地创建和销毁**线程。
14+
15+
```mermaid
16+
graph TD
17+
subgraph 线程池
18+
线程1
19+
线程2
20+
线程3
21+
线程4
22+
线程5
23+
...
24+
end
25+
26+
任务队列[任务队列]
27+
调度器 --> 线程1
28+
调度器 --> 线程2
29+
调度器 --> 线程3
30+
调度器 --> 线程4
31+
调度器 --> 线程5
32+
33+
任务1 --> 调度器
34+
任务2 --> 调度器
35+
任务3 --> 调度器
36+
任务4 --> 调度器
37+
任务5 --> 调度器
38+
任务6 --> 调度器
39+
任务7 --> 调度器
40+
41+
线程1 --> 执行任务1[执行任务1]
42+
线程2 --> 执行任务2[执行任务2]
43+
线程3 --> 执行任务3[执行任务3]
44+
线程4 --> 执行任务4[执行任务4]
45+
线程5 --> 执行任务5[执行任务5]
46+
47+
执行任务1 --> 休眠1[休眠等待]
48+
执行任务2 --> 休眠2[休眠等待]
49+
执行任务3 --> 休眠3[休眠等待]
50+
执行任务4 --> 休眠4[休眠等待]
51+
执行任务5 --> 休眠5[休眠等待]
52+
53+
任务6 --> 调度器 --> 唤醒线程1[唤醒线程1]
54+
唤醒线程1 -.-> 线程1
55+
线程1 --> 执行任务6[执行任务6]
56+
执行任务6 --> 休眠1
57+
58+
任务7 --> 调度器 --> 唤醒线程2[唤醒线程2]
59+
唤醒线程2 -.-> 线程2
60+
线程2 --> 执行任务7[执行任务7]
61+
执行任务7 --> 休眠2
62+
63+
```
64+
65+
> 这是一个典型的线程池结构。线程池包含一个**任务队列**,当有新任务加入时,调度器会将任务分配给线程池中的空闲线程进行执行。线程在执行完任务后会进入**休眠状态**,等待**调度器**的下一次**唤醒**。当有新的任务加入队列,并且有线程处于休眠状态时,调度器会唤醒休眠的线程,并分配新的任务给它们执行。线程执行完新任务后,会再次进入休眠状态,直到有新的任务到来,调度器**才可能**会再次唤醒它们。
66+
>
67+
> 图中线程1 就是被调度器分配了任务1,执行完毕后休眠,然而新任务的到来让调度器再次将它唤醒,去执行任务6,执行完毕后继续休眠。
1468
1569
使用线程池的益处我们已经加粗了,然而这其实并不是“*线程池*”独有的,任何创建和销毁存在较大开销的设施,都可以进行所谓的“***池化***”。
1670

0 commit comments

Comments
 (0)