Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Coudy Hou
JavaGuide
提交
7ee7ffa1
J
JavaGuide
项目概览
Coudy Hou
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7ee7ffa1
编写于
11月 13, 2019
作者:
K
Kou Shuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update java线程池学习总结.md
上级
9b9575d0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
49 addition
and
7 deletion
+49
-7
docs/java/Multithread/java线程池学习总结.md
docs/java/Multithread/java线程池学习总结.md
+49
-7
未找到文件。
docs/java/Multithread/java线程池学习总结.md
浏览文件 @
7ee7ffa1
<!-- TOC -->
-
[
一 使用线程池的好处
](
#一-使用线程池的好处
)
-
[
二 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-执行周期任务的步骤
)
-
[
七 参考
](
#七-参考
)
-
[
八 其他推荐阅读
](
#八-其他推荐阅读
)
<!-- /TOC -->
## 一 使用线程池的好处
> **池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、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()`
)。
## 七 参考
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录