zoukankan      html  css  js  c++  java
  • Java--对象池化技术 org.apache.commons.pool2.ObjectPool

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

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

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

    package com.seeyon.objectPool;
    
    import org.apache.commons.pool2.BasePooledObjectFactory;
    import org.apache.commons.pool2.PooledObject;
    import org.apache.commons.pool2.impl.DefaultPooledObject;
    
    /**
     * Created by yangyu on 16/12/26.
     */
    
    /**
     * 对象工厂,用于创建对象
     */
    public class ObjectFactory extends BasePooledObjectFactory<ObjectFactory.Computer> {
    
    
        /**
         * 创建对象,返回你需要的对象实例就可以啦
         * @return
         * @throws Exception
         */
        @Override
        public Computer create() throws Exception {
            return new Computer("mac");
        }
    
        /**
         * 包装对象,将对象包装为PooledObject
         * @param obj
         * @return
         */
        @Override
        public PooledObject<Computer> wrap(Computer obj) {
            return new DefaultPooledObject<>(obj);
        }
    
        public class Computer{
    
            String name;
    
            public Computer(String name){
                this.name = name;
            }
        }
    }

    2、使用对象池

    package com.seeyon.objectPool;
    
    import org.apache.commons.pool2.ObjectPool;
    import org.apache.commons.pool2.impl.GenericObjectPool;
    
    /**
     * Created by yangyu on 16/12/26.
     */
    
    /**
     * org.apache.commons.pool2.ObjectPool对象池的使用
     * 直接apache使用对象池,可以实现对象池化技术
     */
    public class TestObjectPool {
        public static void main(String[] args) throws InterruptedException {
            /**
             * 创建对象工厂
             */
            ObjectFactory objectFactory = new ObjectFactory();
            /**
             * 创建一个普通的对象池
             */
            ObjectPool<ObjectFactory.Computer> objectPool = new GenericObjectPool(objectFactory);
    
            /**
             * 创建第一个线程
             */
            Thread t1 = new Thread(() -> {
                try {
                    /**
                     * 从对象池中获取对象
                     */
                    ObjectFactory.Computer computer = objectPool.borrowObject();
                    System.out.println(Thread.currentThread().getId() + ":" + computer);
                    /**
                     * 用完后将对象放回对象池中
                     */
                    objectPool.returnObject(computer);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    
            t1.start();
            t1.join();
    
            new Thread(() -> {
                try {
                    /**
                     * 再次从对象池中获取对象,你会发现获取的是同一个对象,说明对象池化技术成功
                     */
                    System.out.println(Thread.currentThread().getId() + ":" + objectPool.borrowObject());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
    
        }
    }

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

    11:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4
    12:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4
  • 相关阅读:
    Android游戏开发:游戏框架的搭建(4)
    Android游戏开发:游戏框架的搭建(2)
    android之HttpURLConnection
    Android游戏开发:游戏框架的搭建(3)
    Socket连接与HTTP连接
    Java初级优化
    Android文件操作总结
    android GC内存泄露问题
    Java高级优化技术
    JAVA中三种URL连接方法
  • 原文地址:https://www.cnblogs.com/eoss/p/6221819.html
Copyright © 2011-2022 走看看