Skip to content

Commit 7ee7ffa

Browse files
committed
Update java线程池学习总结.md
1 parent 9b9575d commit 7ee7ffa

File tree

1 file changed

+49
-7
lines changed

1 file changed

+49
-7
lines changed

docs/java/Multithread/java线程池学习总结.md

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,47 @@
1+
<!-- TOC -->
2+
3+
- [一 使用线程池的好处](#一-使用线程池的好处)
4+
- [二 Executor 框架](#二-executor-框架)
5+
- [2.1 简介](#21-简介)
6+
- [2.2 Executor 框架结构(主要由三大部分组成)](#22-executor-框架结构主要由三大部分组成)
7+
- [1) 任务(`Runnable` /`Callable`)](#1-任务runnable-callable)
8+
- [2) 任务的执行(`Executor`)](#2-任务的执行executor)
9+
- [3) 异步计算的结果(`Future`)](#3-异步计算的结果future)
10+
- [2.3 Executor 框架的使用示意图](#23-executor-框架的使用示意图)
11+
- [三 (重要)ThreadPoolExecutor 类简单介绍](#三-重要threadpoolexecutor-类简单介绍)
12+
- [3.1 ThreadPoolExecutor 类分析](#31-threadpoolexecutor-类分析)
13+
- [3.2 推荐使用 `ThreadPoolExecutor` 构造函数创建线程池](#32-推荐使用-threadpoolexecutor-构造函数创建线程池)
14+
- [四 (重要)ThreadPoolExecutor 使用示例](#四-重要threadpoolexecutor-使用示例)
15+
- [4.1 示例代码:`Runnable`+`ThreadPoolExecutor`](#41-示例代码runnablethreadpoolexecutor)
16+
- [4.2 线程池原理分析](#42-线程池原理分析)
17+
- [4.3 几个常见的对比](#43-几个常见的对比)
18+
- [4.3.1 `Runnable` vs `Callable`](#431-runnable-vs-callable)
19+
- [4.3.2 `execute()` vs `submit()`](#432-execute-vs-submit)
20+
- [4.3.3 `shutdown()`VS`shutdownNow()`](#433-shutdownvsshutdownnow)
21+
- [4.3.2 `isTerminated()` VS `isShutdown()`](#432-isterminated-vs-isshutdown)
22+
- [4.4 加餐:`Callable`+`ThreadPoolExecutor`示例代码](#44-加餐callablethreadpoolexecutor示例代码)
23+
- [五 几种常见的线程池详解](#五-几种常见的线程池详解)
24+
- [5.1 FixedThreadPool](#51-fixedthreadpool)
25+
- [5.1.1 介绍](#511-介绍)
26+
- [5.1.2 执行任务过程介绍](#512-执行任务过程介绍)
27+
- [5.1.3 为什么不推荐使用`FixedThreadPool`](#513-为什么不推荐使用fixedthreadpool)
28+
- [5.2 SingleThreadExecutor 详解](#52-singlethreadexecutor-详解)
29+
- [5.2.1 介绍](#521-介绍)
30+
- [5.2.2 执行任务过程介绍](#522-执行任务过程介绍)
31+
- [5.2.3 为什么不推荐使用`FixedThreadPool`](#523-为什么不推荐使用fixedthreadpool)
32+
- [5.3 CachedThreadPool 详解](#53-cachedthreadpool-详解)
33+
- [5.3.1 介绍](#531-介绍)
34+
- [5.3.2 执行任务过程介绍](#532-执行任务过程介绍)
35+
- [5.3.3 为什么不推荐使用`CachedThreadPool`](#533-为什么不推荐使用cachedthreadpool)
36+
- [六 ScheduledThreadPoolExecutor 详解](#六-scheduledthreadpoolexecutor-详解)
37+
- [6.1 简介](#61-简介)
38+
- [6.2 运行机制](#62-运行机制)
39+
- [6.3 ScheduledThreadPoolExecutor 执行周期任务的步骤](#63-scheduledthreadpoolexecutor-执行周期任务的步骤)
40+
- [七 参考](#七-参考)
41+
- [八 其他推荐阅读](#八-其他推荐阅读)
42+
43+
<!-- /TOC -->
44+
145
## 一 使用线程池的好处
246

347
> **池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。**
@@ -651,12 +695,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5
651695

652696
## 六 ScheduledThreadPoolExecutor 详解
653697

654-
这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。
698+
**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。** 这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。关于如何在Spring Boot 中 实现定时任务,可以查看这篇文章[《5分钟搞懂如何在Spring Boot中Schedule Tasks》](https://github.com/Snailclimb/springboot-guide/blob/master/docs/advanced/SpringBoot-ScheduleTasks.md)
655699

656700
### 6.1 简介
657701

658-
**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。**
659-
660702
**`ScheduledThreadPoolExecutor` 使用的任务队列 `DelayQueue` 封装了一个 `PriorityQueue``PriorityQueue` 会对队列中的任务进行排序,执行所需时间短的放在前面先被执行(`ScheduledFutureTask``time` 变量小的先执行),如果执行所需时间相同则先提交的任务将被先执行(`ScheduledFutureTask``squenceNumber` 变量小的先执行)。**
661703

662704
**`ScheduledThreadPoolExecutor``Timer` 的比较:**
@@ -688,10 +730,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5
688730

689731
![ScheduledThreadPoolExecutor执行周期任务的步骤](https://imgconvert.csdnimg.cn/aHR0cDovL215LWJsb2ctdG8tdXNlLm9zcy1jbi1iZWlqaW5nLmFsaXl1bmNzLmNvbS8xOC01LTMwLzU5OTE2Mzg5LmpwZw?x-oss-process=image/format,png)
690732

691-
1. 线程 1 从 DelayQueue 中获取已到期的 ScheduledFutureTask(DelayQueue.take())。到期任务是指 ScheduledFutureTask 的 time 大于等于当前系统的时间;
692-
2. 线程 1 执行这个 ScheduledFutureTask;
693-
3. 线程 1 修改 ScheduledFutureTask 的 time 变量为下次将要被执行的时间;
694-
4. 线程 1 把这个修改 time 之后的 ScheduledFutureTask 放回 DelayQueue 中(DelayQueue.add())。
733+
1. 线程 1 从 `DelayQueue` 中获取已到期的 `ScheduledFutureTask(DelayQueue.take())`。到期任务是指 `ScheduledFutureTask `的 time 大于等于当前系统的时间;
734+
2. 线程 1 执行这个 `ScheduledFutureTask`
735+
3. 线程 1 修改 `ScheduledFutureTask` 的 time 变量为下次将要被执行的时间;
736+
4. 线程 1 把这个修改 time 之后的 `ScheduledFutureTask` 放回 `DelayQueue` 中(`DelayQueue.add()`)。
695737

696738
## 七 参考
697739

0 commit comments

Comments
 (0)