写于:2020-04-01

《线程池理论分析》
code.7z

一、代码结构

01.png

二、类结构

线程池实现类简图

02.png
自定义线程池实现 BasicThreadPool 实现了线程池接口规范定义 ThreadPool 和继承了 Thread

继承 Thread

继承 Thread 线程池本省也是一个线程,可以在 run 方法中进行,线程扩容和回收操作

实现 ThreadPool 规范

提供统一的接口访问API。

三、相关代码

线程池存放任务的队列

03.png
1、队列需要容器存放任务

  1. /** 存放人物的队列 **/
  2. private final LinkedList<Runnable> runnableLinkedList = new LinkedList<>();

2、队列需要有上限

  1. /** 任务队列最大容量,构造式传入 **/
  2. private final int limit;

3、队列达到上限,需要有拒绝策略

  1. /** 任务队列达到最大容量时,拒绝策略 **/
  2. private final DenyPolicy denyPolicy;

4、队列需要有,存取的操作

  1. // 存
  2. @Override
  3. public void offer(Runnable runnable) {
  4. synchronized (runnableLinkedList){
  5. if(runnableLinkedList.size() >= limit){
  6. // 任务队列满,执行拒绝策略
  7. denyPolicy.reject(runnable,threadPool);
  8. }else{
  9. // 任务队列未满,将任务加入队列最末尾处,并唤醒阻塞任务
  10. runnableLinkedList.addLast(runnable);
  11. runnableLinkedList.notifyAll();
  12. }
  13. }
  14. }
  15. // 取
  16. @Override
  17. public Runnable take() throws InterruptedException{
  18. synchronized(runnableLinkedList){
  19. while (runnableLinkedList.isEmpty()){
  20. try {
  21. // 如果任务队列没有可执行任务,当前线程挂起,进入 runnableLinkedList 关联的 monitor waitset 中
  22. // 等待被唤醒
  23. runnableLinkedList.wait();
  24. } catch (InterruptedException e) {
  25. // 被中断时,抛出异常
  26. throw e;
  27. }
  28. }
  29. // 从任务队列头部移除一个任务
  30. return runnableLinkedList.removeFirst();
  31. }
  32. }

四、测试