这一系列主要说的是org.apache.commons.pool2包提供的ObjectPool以及对应的实现源码。

1.已有连接池举例

目前已知的对象池的应用,比如:

数据库连接池——org.apache.commons.dbcp2的BasicDataSource

jedis连接池——redis.clients.jedis的JedisPool。

2.线程池

线程池的用法和这个不太一样,因为线程的run方法执行完之后,一个线程的使命就结束了。所以如果要想重用线程,就需要阻止run方法的结束,用死循环等方法。目前jdk线程池使用的是结合LinkedBlockingQueue,通过队列的阻塞方法让当前线程休眠,等待任务并处理,实现单个线程的重用。

execute方法会添加一个worker。

public void execute(Runnable command) {if (workerCountOf(c) < corePoolSize) {if (addWorker(command, true))...
}
private boolean addWorker(Runnable firstTask, boolean core) {...Worker w = new Worker(firstTask);Thread t = w.thread;...try {...workers.add(w);...} finally {mainLock.unlock();}t.start();...
}

用当前的Runnable task构造一个Worker,并启动该worker中的thread,该thread以该Woker自己为任务,任务内容是

/** Delegates main run loop to outer runWorker  */public void run() {runWorker(this);}
final void runWorker(Worker w) {Runnable task = w.firstTask;w.firstTask = null;boolean completedAbruptly = true;try {while (task != null || (task = getTask()) != null) {w.lock();clearInterruptsForTaskRun();try {beforeExecute(w.thread, task);Throwable thrown = null;try {task.run();} catch (RuntimeException x) {thrown = x; throw x;} catch (Error x) {thrown = x; throw x;} catch (Throwable x) {thrown = x; throw new Error(x);} finally {afterExecute(task, thrown);}} finally {task = null;w.completedTasks++;w.unlock();}}completedAbruptly = false;} finally {processWorkerExit(w, completedAbruptly);}}

while循环第一次执行的时候task不是null,执行一次之后,task为null,getTask从队列中取任务。

取任务的时候,如果allowCoreThreadTimeOut是true,或者当前线程数量已经超过了核心线程数量,从LinkedBlockingQueue中取任务会有等待时间,等待的时间由keepAliveTime决定。

关于线程池详细部分在线程池篇再说,这里只是说一下为什么线程的重用不能使用对象池。

pool(一)——入门相关推荐

  1. 【Python】Python学习教程与资源链接

    一.Python基础 Python简明教程(Python3) Python3.7.4官方中文文档 Python标准库中文版 廖雪峰 Python 3 中文教程 Python 3.3 官方教程中文版 P ...

  2. 最全数据分析资料汇总(含python、爬虫、数据库、大数据、tableau、统计学等)

    转自知乎:朱卫军 一.Python基础 Python简明教程(Python3) Python3.7.4官方中文文档 Python标准库中文版 廖雪峰 Python 3 中文教程 Python 3.3 ...

  3. Python 进程池 multiprocessing.Pool - Python零基础入门教程

    目录 一.Python 进程池 multiprocessing.Pool 介绍 二.Python 进程池 multiprocessing.Pool 使用 三.猜你喜欢 零基础 Python 学习路线推 ...

  4. HBase编程 API入门系列之HTable pool(6)

    HTable是一个比较重的对此,比如加载配置文件,连接ZK,查询meta表等等,高并发的时候影响系统的性能,因此引入了"池"的概念. 引入"HBase里的连接池" ...

  5. pool(二)——动手入门

    1.定义自己的MyConnection public class MyConnection {private static Logger logger = LoggerFactory.getLogge ...

  6. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  7. python编程求圆的面积案例_Python实用案例编程入门:第七章 调式手段

    本章的主题为调试手段,这是程序开发必不可少的步骤,也是占用时间最多的环节.在程序员的正常开发工作中,调试工作至少占据1/3的时间,而实际编码工作相对占用实际比较少.因此,无论您是初学者,还是编程兴趣爱 ...

  8. 5行代码就能入门爬虫?

    作者 | 苏克1900 来源 | 第2大脑(ID:Mocun6) 责编 | swallow 不少读者是刚刚入门Python或者想学习Python的,今天就来谈谈如何用快速入门爬虫. 先说结论:入门爬虫 ...

  9. 【AI参赛经验】深度学习入门指南:从零开始TinyMind汉字书法识别——by:Link

    各位人工智能爱好者,大家好! 由TinyMind发起的#第一届汉字书法识别挑战赛#正在火热进行中,比赛才开始3周,已有数只黑马冲进榜单.目前TOP54全部为90分以上!可谓竞争激烈,高手如林.不是比赛 ...

最新文章

  1. 程序员是复制粘贴的工具人?还是掌握“谜底”的魔术师?
  2. post xmlrpc.php,宝塔面板WordPress /xmlrpc.php经常被post恶意数据
  3. 项目实战-微信扫码登录
  4. why do you need that a awesome linkedin profile
  5. 钉钉自带浏览器版本过低,导致Object.assign不兼容...
  6. 第1章 Ext JS介绍与快速入门[1/4]
  7. 【Swing/文本组件】定义自动换行的文本域
  8. Android平台ROM的定制及精简教程
  9. 软考高项-案例分析背诵
  10. JavaScript 学习手册二:JS 数据类型
  11. XX和OO(南阳oj1159)
  12. Edge浏览器保存主页视频的方法
  13. 开放平台API安全设计方案
  14. android 自定义 锁屏
  15. 基于Swing的Java学生成绩管理系统
  16. 字符串低位优先排序(LSD)和高位优先排序(MSD)原理及C++实现
  17. 基于改进禁忌搜索算法求解TSP问题(Matlab代码实现)
  18. 前端开发规范【范本】
  19. 硬件篇——阻容串联电路
  20. 统计学|线性回归模型总结

热门文章

  1. Http超文本传输协议的特点
  2. Holt Winter时间序列模型
  3. RuntimeError: mat1 and mat2 shapes cannot be multiplied
  4. 【Python】pandas遍历读取excel文件,修改并保存(一)
  5. EasyExcel3.0.5 解决大数据导入导出,防止OOM
  6. 手机端微信发朋友圈功能测试点总结
  7. 微信api接口调用-发朋友圈
  8. 电商场景化营销主要从哪几方面展开行无疆带你了解
  9. 在线ping服务器地址,网站全国各地Ping值测试|在线ping工具—卡卡网 www.webkaka.com...
  10. python显示gif图片报错_4种方法(plglet、tkinter、guizero、pygame)的GUI中显示gif