写于:2020-04-01
一、代码结构
二、类结构
线程池实现类简图
自定义线程池实现 BasicThreadPool
实现了线程池接口规范定义 ThreadPool
和继承了 Thread
继承 Thread
继承 Thread
线程池本省也是一个线程,可以在 run
方法中进行,线程扩容和回收操作
实现 ThreadPool
规范
提供统一的接口访问API。
三、相关代码
线程池存放任务的队列
1、队列需要容器存放任务
/** 存放人物的队列 **/
private final LinkedList<Runnable> runnableLinkedList = new LinkedList<>();
2、队列需要有上限
/** 任务队列最大容量,构造式传入 **/
private final int limit;
3、队列达到上限,需要有拒绝策略
/** 任务队列达到最大容量时,拒绝策略 **/
private final DenyPolicy denyPolicy;
4、队列需要有,存取的操作
// 存
@Override
public void offer(Runnable runnable) {
synchronized (runnableLinkedList){
if(runnableLinkedList.size() >= limit){
// 任务队列满,执行拒绝策略
denyPolicy.reject(runnable,threadPool);
}else{
// 任务队列未满,将任务加入队列最末尾处,并唤醒阻塞任务
runnableLinkedList.addLast(runnable);
runnableLinkedList.notifyAll();
}
}
}
// 取
@Override
public Runnable take() throws InterruptedException{
synchronized(runnableLinkedList){
while (runnableLinkedList.isEmpty()){
try {
// 如果任务队列没有可执行任务,当前线程挂起,进入 runnableLinkedList 关联的 monitor waitset 中
// 等待被唤醒
runnableLinkedList.wait();
} catch (InterruptedException e) {
// 被中断时,抛出异常
throw e;
}
}
// 从任务队列头部移除一个任务
return runnableLinkedList.removeFirst();
}
}