File tree 1 file changed +55
-1
lines changed
1 file changed +55
-1
lines changed Original file line number Diff line number Diff line change 10
10
11
11
“** 池** ”?水池装着水,线程池则是装着线程,是一种抽象的指代。
12
12
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,执行完毕后继续休眠。
14
68
15
69
使用线程池的益处我们已经加粗了,然而这其实并不是“* 线程池* ”独有的,任何创建和销毁存在较大开销的设施,都可以进行所谓的“*** 池化*** ”。
16
70
You can’t perform that action at this time.
0 commit comments