没有合适的资源?快使用搜索试试~ 我知道了~
【并发编程】自定义简单线程池.pdf
需积分: 1 1 下载量 65 浏览量
2024-05-03
13:47:39
上传
评论
收藏 911KB PDF 举报
温馨提示
试读
12页
资源内容 基本概念:介绍并发编程的基本概念,如进程、线程、并行与并发的区别等。 同步机制:讲解如何使用锁、信号量、原子操作等同步机制来避免竞态条件和死锁。 并发模型:介绍不同的并发模型,如生产者-消费者模型、管道模型、消息传递模型等。 并发工具:介绍并发编程中使用的工具和库,如线程池、并发集合等。 性能优化:讨论如何优化并发程序的性能,包括减少上下文切换、提高缓存效率等。 错误处理:讲解并发编程中的错误处理,如异常安全、错误传播等。 实际案例:通过实际的编程案例来展示并发编程的应用。 适合的人群 初学者:对计算机科学或编程有一定了解,但尚未接触过并发编程的开发者。 中级开发者:已经具备一定的编程经验,希望提高程序性能或学习多线程开发的人员。 高级开发者:需要深入理解并发编程原理,解决复杂并发问题的资深开发者。 计算机科学学生:正在学习计算机科学,对并发和分布式系统感兴趣的学生。 系统架构师:负责设计和优化大型系统架构,需要了解并发编程以提高系统性能的专业人员。 学习资源 在线课程:如Coursera、edX、Udemy等平台上的并发编程课程。 书籍:如《Java并发编程实战》、《Concurrency in C++》等。 官方文档:不同编程语言的官方文档通常会提供关于并发编程的指南和最佳实践。 社区和论坛:如Stack Overflow、Reddit等,可以提供实际问题的帮助和讨论。
资源推荐
资源详情
资源评论
2
、流程分析
根据上面的概念图,进一步模拟一遍整个线程池执行的流程:
1
.
初始化线程池,指定线程池的参数如核心线程数、阻塞队列容量、超时时间、拒绝策略
;
2
.
并发生产任务压入线程池执行;
1
.
工作线程数未达到设定的核心线程数。新建工作线程执行任务,并将工作线程加
入到线程池中的线程集合中;
2
.
工作线程数达到了设定的核心线程数。尝试往阻塞队列中暂存任务,当阻塞队列
已满无法添加时,采用指定的拒绝策略对任务进行拒绝。
3
.
工作线程执行完当前任务时,循环从阻塞队列中获取任务并执行直到消费完阻塞队列中的
任务;
4
.
当无任务时,将工作线程回收销毁。
3
、设计思路及实现
整体的设计思路应该由广到细,整体到局部。前面的概念图以及流程分析其实就算是一个整体的
设计了,接下来便是局部的设计了。首先先列举一下需要的部分,分别为:
线程池
工作线程
阻塞队列
拒绝策略
结合上面一二点的描述我们可以得出线程池中用到了工作线程和阻塞队列,而当阻塞队列满时需
要根据拒绝策略进行任务拒绝,因此我们采取自下而上的方式逐一设计需要的几大主体。
3
.
1
、拒绝策略
其实拒绝策略就是一段逻辑,通过调用者告知使用哪种方式进行任务拒绝。根据
OOP
思想 ,这
一段逻辑我们可以封装成不同的方法,通过传入不同的标识选用不同的方法即可。这里使用了
Java1.8
出现的函数式编程进行设计,将这一个逻辑封装成一个函数式接口,调用者可直接使用
La
m
b
d
a
表达式指定需要的拒绝策略,也可将逻辑封装成一个枚举类,直接传入对应的方法即可,这符
合设计模式中的开闭原则,可维护性更高。
3
.
2
、阻塞队列
在该阻塞队列中采取了 公平的
FIFO
形式 ,避免任务一直得不到消费出现饿死情况,因此内部
需要维护一个双向队列。出于内存层面考虑,我们需要维护一个队列最大容量变量,用于判断队列是
否已满,避免
OOM
问题 出现。同时由于阻塞队列为多线程下的共享资源,我们需要对其上锁保证在
并发消费下的原子性。最后为了阻塞队列的拓展性,队列中存放的内容采取泛型设计。
双向队列
D
eque
:
Ja
v
a
内置的双向队列接口,实现类采用
A
rr
a
y
D
eque
,在大部分情况下
会比
L
ink
L
ist
性能要好一点;
最大容量
ca
p
ac
ity
:基本整形变量,用于判断队列是否已满;
锁对象
LOCK
:采用可重入锁
R
eentr
a
nt
L
o
c
k
实现,并分别设置消费者条件变量与生产者
条件变量,对队列为空与队列已满两种情况进行隔离。
在变量设计完成之后,我们还需要对队列中的方法进行设计。显而易见的是队列的核心任务为存
和取,重点的是怎么存和取。比较容易想到的是超时与无超时限制的存取,但是这样子的话并没有用
到我们的拒绝策略,因此应该还有一个方法是尝试将任务存入队列中,当队列满时采用指定的拒绝策
略即可。
void put(T task)
:添加任务,这是一个阻塞添加无超时的方法,即这个方式在队列
已满时会一直等待直到队列中出现闲余空间;
boolean put(T task, long timeout, TimeUnit timeUnit)
:带超时限制的
添加任务,当等待了指定时间后队列仍然无空间时,则会放弃当前任务退出等待;
void tryPut(T task, RejectPolicy<T> rejectPolicy)
:尝试添加任务,如
果任务队列满了会根据传入的拒绝策略对任务进行处理;
T take()
:获取任务,这是一个阻塞获取无超时的方法,即队列为空时会一直等待直到
队列中出现任务;
T take(long timeout, TimeUnit unit)
:带超时时间限制返回获取到的任务,
当等待了指定时间后队列仍然为空时,则会放弃获取退出等待。
@FunctionalInterface
public interface RejectPolicy<T> {
/**
* @description 拒绝策略中的拒绝方法,可自定义设置适合的拒绝策略
* @author xbaozi
* @date 2022/11/18 22:34
* @param queue 阻塞队列
* @param task 需要拒绝的任务
**/
void reject(BlockingQueue<T> queue, T task);
}
1
2
3
4
5
6
7
8
9
10
11
/**
* @author xbaozi
* @version 1.0
1
2
3
剩余11页未读,继续阅读
资源评论
Aniay_ivy
- 粉丝: 1172
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功