File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments