|
| 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 | + |
1 | 45 | ## 一 使用线程池的好处
|
2 | 46 |
|
3 | 47 | > **池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。**
|
@@ -651,12 +695,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5
|
651 | 695 |
|
652 | 696 | ## 六 ScheduledThreadPoolExecutor 详解
|
653 | 697 |
|
654 |
| -这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。 |
| 698 | +**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。** 这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。关于如何在Spring Boot 中 实现定时任务,可以查看这篇文章[《5分钟搞懂如何在Spring Boot中Schedule Tasks》](https://github.com/Snailclimb/springboot-guide/blob/master/docs/advanced/SpringBoot-ScheduleTasks.md)。 |
655 | 699 |
|
656 | 700 | ### 6.1 简介
|
657 | 701 |
|
658 |
| -**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。** |
659 |
| - |
660 | 702 | **`ScheduledThreadPoolExecutor` 使用的任务队列 `DelayQueue` 封装了一个 `PriorityQueue`,`PriorityQueue` 会对队列中的任务进行排序,执行所需时间短的放在前面先被执行(`ScheduledFutureTask` 的 `time` 变量小的先执行),如果执行所需时间相同则先提交的任务将被先执行(`ScheduledFutureTask` 的 `squenceNumber` 变量小的先执行)。**
|
661 | 703 |
|
662 | 704 | **`ScheduledThreadPoolExecutor` 和 `Timer` 的比较:**
|
@@ -688,10 +730,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5
|
688 | 730 |
|
689 | 731 | 
|
690 | 732 |
|
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()`)。 |
695 | 737 |
|
696 | 738 | ## 七 参考
|
697 | 739 |
|
|
0 commit comments