org.apache.commons.pool2.ObjectPool提供了对象池,开发的小伙伴们可以直接使用来构建一个对象池

使用该对象池具有两个简单的步骤:

1、创建对象工厂,org.apache.commons.pool2.BasePooledObjectFactory已经对工厂有抽象实现,所以只需要继承该类,实现模板方法即可

  1. package com.seeyon.objectPool;
  2.  
  3. import org.apache.commons.pool2.BasePooledObjectFactory;
  4. import org.apache.commons.pool2.PooledObject;
  5. import org.apache.commons.pool2.impl.DefaultPooledObject;
  6.  
  7. /**
  8. * Created by yangyu on 16/12/26.
  9. */
  10.  
  11. /**
  12. * 对象工厂,用于创建对象
  13. */
  14. public class ObjectFactory extends BasePooledObjectFactory<ObjectFactory.Computer> {
  15.  
  16. /**
  17. * 创建对象,返回你需要的对象实例就可以啦
  18. * @return
  19. * @throws Exception
  20. */
  21. @Override
  22. public Computer create() throws Exception {
  23. return new Computer("mac");
  24. }
  25.  
  26. /**
  27. * 包装对象,将对象包装为PooledObject
  28. * @param obj
  29. * @return
  30. */
  31. @Override
  32. public PooledObject<Computer> wrap(Computer obj) {
  33. return new DefaultPooledObject<>(obj);
  34. }
  35.  
  36. public class Computer{
  37.  
  38. String name;
  39.  
  40. public Computer(String name){
  41. this.name = name;
  42. }
  43. }
  44. }

2、使用对象池

  1. package com.seeyon.objectPool;
  2.  
  3. import org.apache.commons.pool2.ObjectPool;
  4. import org.apache.commons.pool2.impl.GenericObjectPool;
  5.  
  6. /**
  7. * Created by yangyu on 16/12/26.
  8. */
  9.  
  10. /**
  11. * org.apache.commons.pool2.ObjectPool对象池的使用
  12. * 直接apache使用对象池,可以实现对象池化技术
  13. */
  14. public class TestObjectPool {
  15. public static void main(String[] args) throws InterruptedException {
  16. /**
  17. * 创建对象工厂
  18. */
  19. ObjectFactory objectFactory = new ObjectFactory();
  20. /**
  21. * 创建一个普通的对象池
  22. */
  23. ObjectPool<ObjectFactory.Computer> objectPool = new GenericObjectPool(objectFactory);
  24.  
  25. /**
  26. * 创建第一个线程
  27. */
  28. Thread t1 = new Thread(() -> {
  29. try {
  30. /**
  31. * 从对象池中获取对象
  32. */
  33. ObjectFactory.Computer computer = objectPool.borrowObject();
  34. System.out.println(Thread.currentThread().getId() + ":" + computer);
  35. /**
  36. * 用完后将对象放回对象池中
  37. */
  38. objectPool.returnObject(computer);
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. });
  43.  
  44. t1.start();
  45. t1.join();
  46.  
  47. new Thread(() -> {
  48. try {
  49. /**
  50. * 再次从对象池中获取对象,你会发现获取的是同一个对象,说明对象池化技术成功
  51. */
  52. System.out.println(Thread.currentThread().getId() + ":" + objectPool.borrowObject());
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. }).start();
  57.  
  58. }
  59. }

3、输出结果:可以看到两个线程一先一后,使用的同一个对象,池化技术使用完成。

  1. 11:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4
  2. 12:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4

Java--对象池化技术 org.apache.commons.pool2.ObjectPool的更多相关文章

  1. 对象池化技术 org.apache.commons.pool

    恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...

  2. java对象池化技术

    https://blog.csdn.net/tiane5hao/article/details/85957840 文章目录 先写一个简单通用的对象池 通过上面的通用池实现jedis连接池 连接池测试 ...

  3. Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  4. java对象池commons-pool-1.6详解(一)

    自己的项目中用到了 对象池 commons-pool: package com.sankuai.qcs.regulation.protocol.client; import com.dianping. ...

  5. 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...

  6. Java 数据持久化系列之池化技术

    在上一篇文章<Java 数据持久化系列之JDBC>中,我们了解到使用 JDBC 创建 Connection 可以执行对应的SQL,但是创建 Connection 会消耗很多资源,所以 Ja ...

  7. Java对象池

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  8. Java对象池示例

    单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...

  9. commons-pool2 池化技术探究

    一.前言 我们经常会接触各种池化的技术或者概念,包括对象池.连接池.线程池等,池化技术最大的好处就是实现对象的重复利用,尤其是创建和使用大对象或者宝贵资源(HTTP连接对象,MySQL连接对象)等方面 ...

随机推荐

  1. Docker+nginx+tomcat7配置简单的负载均衡

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/4995513.html 本文介绍在Docker上配置简单的负载均衡,宿主机为Ubuntu 14.04.2 ...

  2. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob

    <Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...

  3. SSISDB7:查看当前正在运行的Package

    在项目组中做ETL开发时,经常会被问到:“现在ETL跑到哪一个Package了?” 为了缩短ETL运行的时间,在ETL的设计上,经常会使用并发执行模式:Task 并发执行,Package并发执行.对于 ...

  4. VMware 中如何打开U盘弹出U盘或者移动硬盘的(两种方法)

    1.U盘如下,插入后都是直接在win里面显示的 2.选择连接u盘 3.u盘就可以在虚拟机里面显示了 4.弹出则选择断开连接 扩展:如果无效:请参考这种方法 (给虚拟机分配一个临时硬盘,然后设置这个临时 ...

  5. LINQ系列:Linq to Object转换操作符

    转换是指将输入对象的类型转变为序列的动作. 1. AsEnumerable AsEnumerable操作符将查询的输入以IEnumberable(T)类型返回. 2. Cast Cast操作符将IEn ...

  6. js立即执行函数

    一.JS立即执行函数的写法 方式1.最前最后加括号 (function(){alert(1);}()); 方式2.function外面加括号   (function(){alert(1);})(); ...

  7. 数据结构与算法JavaScript (三) 链表

    我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言 ...

  8. WebService 学习之路(一):了解并使用webService

    webService主要用于向其他系统提供接口以便调用,系统间可能开发语言等完全不同,根据约定的接口规范,调用者传递相关参数进行接口调用,服务方根据传入的条件进行业务处理并进行结果返回. webSer ...

  9. 利用pixi.js制作精灵动画

    CSS Sprites 技术对于广大的前端工程师来说应该是一点也不陌生.国内开发者昵称为CSS精灵,通过一定的技术手段,让精灵动起来,我称其为精灵动画,那么目前有哪些实现方式 呢?下面让我们详细的聊聊 ...

  10. [c++] constexpr and literal class

    稀奇古怪的新特性,菜鸟在此啄上一啄. 1. When should literal classes be used in C++?   2. int i; // not constant const ...