From 7ee7ffa1f0e1d362a06692268b43735852b25096 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 13 Nov 2019 15:30:31 +0800 Subject: [PATCH] =?UTF-8?q?Update=20java=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\346\200\273\347\273\223.md" | 56 ++++++++++++++++--- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git "a/docs/java/Multithread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/Multithread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" index 232671b6..a172bbc4 100644 --- "a/docs/java/Multithread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/java/Multithread/java\347\272\277\347\250\213\346\261\240\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -1,3 +1,47 @@ + + +- [一 使用线程池的好处](#一-使用线程池的好处) +- [二 Executor 框架](#二-executor-框架) + - [2.1 简介](#21-简介) + - [2.2 Executor 框架结构(主要由三大部分组成)](#22-executor-框架结构主要由三大部分组成) + - [1) 任务(`Runnable` /`Callable`)](#1-任务runnable-callable) + - [2) 任务的执行(`Executor`)](#2-任务的执行executor) + - [3) 异步计算的结果(`Future`)](#3-异步计算的结果future) + - [2.3 Executor 框架的使用示意图](#23-executor-框架的使用示意图) +- [三 (重要)ThreadPoolExecutor 类简单介绍](#三-重要threadpoolexecutor-类简单介绍) + - [3.1 ThreadPoolExecutor 类分析](#31-threadpoolexecutor-类分析) + - [3.2 推荐使用 `ThreadPoolExecutor` 构造函数创建线程池](#32-推荐使用-threadpoolexecutor-构造函数创建线程池) +- [四 (重要)ThreadPoolExecutor 使用示例](#四-重要threadpoolexecutor-使用示例) + - [4.1 示例代码:`Runnable`+`ThreadPoolExecutor`](#41-示例代码runnablethreadpoolexecutor) + - [4.2 线程池原理分析](#42-线程池原理分析) + - [4.3 几个常见的对比](#43-几个常见的对比) + - [4.3.1 `Runnable` vs `Callable`](#431-runnable-vs-callable) + - [4.3.2 `execute()` vs `submit()`](#432-execute-vs-submit) + - [4.3.3 `shutdown()`VS`shutdownNow()`](#433-shutdownvsshutdownnow) + - [4.3.2 `isTerminated()` VS `isShutdown()`](#432-isterminated-vs-isshutdown) + - [4.4 加餐:`Callable`+`ThreadPoolExecutor`示例代码](#44-加餐callablethreadpoolexecutor示例代码) +- [五 几种常见的线程池详解](#五-几种常见的线程池详解) + - [5.1 FixedThreadPool](#51-fixedthreadpool) + - [5.1.1 介绍](#511-介绍) + - [5.1.2 执行任务过程介绍](#512-执行任务过程介绍) + - [5.1.3 为什么不推荐使用`FixedThreadPool`?](#513-为什么不推荐使用fixedthreadpool) + - [5.2 SingleThreadExecutor 详解](#52-singlethreadexecutor-详解) + - [5.2.1 介绍](#521-介绍) + - [5.2.2 执行任务过程介绍](#522-执行任务过程介绍) + - [5.2.3 为什么不推荐使用`FixedThreadPool`?](#523-为什么不推荐使用fixedthreadpool) + - [5.3 CachedThreadPool 详解](#53-cachedthreadpool-详解) + - [5.3.1 介绍](#531-介绍) + - [5.3.2 执行任务过程介绍](#532-执行任务过程介绍) + - [5.3.3 为什么不推荐使用`CachedThreadPool`?](#533-为什么不推荐使用cachedthreadpool) +- [六 ScheduledThreadPoolExecutor 详解](#六-scheduledthreadpoolexecutor-详解) + - [6.1 简介](#61-简介) + - [6.2 运行机制](#62-运行机制) + - [6.3 ScheduledThreadPoolExecutor 执行周期任务的步骤](#63-scheduledthreadpoolexecutor-执行周期任务的步骤) +- [七 参考](#七-参考) +- [八 其他推荐阅读](#八-其他推荐阅读) + + + ## 一 使用线程池的好处 > **池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。** @@ -651,12 +695,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5 ## 六 ScheduledThreadPoolExecutor 详解 -这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。 +**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。** 这个在实际项目中基本不会被用到,所以对这部分大家只需要简单了解一下它的思想。关于如何在Spring Boot 中 实现定时任务,可以查看这篇文章[《5分钟搞懂如何在Spring Boot中Schedule Tasks》](https://github.com/Snailclimb/springboot-guide/blob/master/docs/advanced/SpringBoot-ScheduleTasks.md)。 ### 6.1 简介 -**`ScheduledThreadPoolExecutor` 主要用来在给定的延迟后运行任务,或者定期执行任务。** - **`ScheduledThreadPoolExecutor` 使用的任务队列 `DelayQueue` 封装了一个 `PriorityQueue`,`PriorityQueue` 会对队列中的任务进行排序,执行所需时间短的放在前面先被执行(`ScheduledFutureTask` 的 `time` 变量小的先执行),如果执行所需时间相同则先提交的任务将被先执行(`ScheduledFutureTask` 的 `squenceNumber` 变量小的先执行)。** **`ScheduledThreadPoolExecutor` 和 `Timer` 的比较:** @@ -688,10 +730,10 @@ Wed Nov 13 13:40:43 CST 2019::pool-1-thread-5 ![ScheduledThreadPoolExecutor执行周期任务的步骤](https://imgconvert.csdnimg.cn/aHR0cDovL215LWJsb2ctdG8tdXNlLm9zcy1jbi1iZWlqaW5nLmFsaXl1bmNzLmNvbS8xOC01LTMwLzU5OTE2Mzg5LmpwZw?x-oss-process=image/format,png) -1. 线程 1 从 DelayQueue 中获取已到期的 ScheduledFutureTask(DelayQueue.take())。到期任务是指 ScheduledFutureTask 的 time 大于等于当前系统的时间; -2. 线程 1 执行这个 ScheduledFutureTask; -3. 线程 1 修改 ScheduledFutureTask 的 time 变量为下次将要被执行的时间; -4. 线程 1 把这个修改 time 之后的 ScheduledFutureTask 放回 DelayQueue 中(DelayQueue.add())。 +1. 线程 1 从 `DelayQueue` 中获取已到期的 `ScheduledFutureTask(DelayQueue.take())`。到期任务是指 `ScheduledFutureTask `的 time 大于等于当前系统的时间; +2. 线程 1 执行这个 `ScheduledFutureTask`; +3. 线程 1 修改 `ScheduledFutureTask` 的 time 变量为下次将要被执行的时间; +4. 线程 1 把这个修改 time 之后的 `ScheduledFutureTask` 放回 `DelayQueue` 中(`DelayQueue.add()`)。 ## 七 参考 -- GitLab