java common pool_common-pool2 使用

本文介绍如何使用Common-Pool2实现对象池管理,包括创建管理对象的工厂模式及对象池实例化过程。
部署运行你感兴趣的模型镜像

common-pool2 使用

common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象池为例介绍其使用方式,一般实现自己的对象池需要经过2个步骤

实现PooledObjectFactory接口:该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象

创建对象池(GenericObjectPool(PooledObjectFactory))实例

创建Conn对象池

我们假设Conn对象是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例

import org.slf4j.LoggerFactory;

/**

* common-pool2 使用方式

*

* 假设这是一个建立TCP连接的对象,该对象的初始化时间平均为500ms,为了避免在程序中频繁创建Conn对象,我们需要借助对象池管理Conn对象实例

*

* @author WangJun

* @version 1.0 15/10/28

* @since 1.6

*/

public class Conn {

/**

* 记录对象的创建时间

*/

private long createTime;

/**

* 初始化Conn对象,模拟创建Conn对象平均消耗500ms

* @throws InterruptedException

*/

public Conn() throws InterruptedException {

Thread.sleep(500);

createTime = System.currentTimeMillis();

LoggerFactory.getLogger(getClass()).debug(" init conn suc... " + createTime);

}

/**

* 报告Conn对象信息

*/

public void report() {

LoggerFactory.getLogger(getClass()).info("this is a available conn " + createTime);

}

}

利用工厂模式,使对象池通过该工厂模式创建管理的对象

package com.peaceful.pool.demo;

import org.apache.commons.pool2.BasePooledObjectFactory;

import org.apache.commons.pool2.PooledObject;

import org.apache.commons.pool2.PooledObjectFactory;

import org.apache.commons.pool2.impl.DefaultPooledObject;

/**

* common-pool2 使用方式

*

* 为了使用common-pool2对象池管理,我们必须实现{@link org.apache.commons.pool2.PooledObjectFactory}或者其子类

* 这是一个工厂模式,告诉对象池怎样去创建要管理的对象

*

* BasePooledObjectFactory 是对{@link org.apache.commons.pool2.PooledObjectFactory}的一个基本实现,我们可以继承该类,减少一些方法的实现

*

* 在实现{@link org.apache.commons.pool2.PooledObjectFactory}接口时,我们一定要实现的接口方法是{@link PooledObjectFactory#makeObject()}方法。

*

* @author WangJun

* @version 1.0 15/10/28

* @since 1.6

*/

public class ConnFactory extends BasePooledObjectFactory {

/**

* 间接实现{@link PooledObjectFactory#makeObject()}方法,表明怎样创建需要管理对象

*/

@Override

public Conn create() throws Exception {

return new Conn();

}

/**

* 在common-pool2中为了统计管理的对象的一些信息,比如调用次数,空闲时间,上次使用时间等,需要对管理的对象进行包装,然后在放入到对象池中

*

* @param obj 对象池要管理的对象

* @return 返回包装后的PooledObject对象

*/

@Override

public PooledObject wrap(Conn obj) {

return new DefaultPooledObject(obj);

}

}

为了模拟的更真实,ConnPool池可以让使用者个性化配置

package com.peaceful.pool.demo;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

/**

* common-pool2 使用方式

*

* {@link org.apache.commons.pool2.impl.GenericObjectPool}支持个性化配置,我们可以配置对象池中总共的对象数,最大、最小空闲对象数等等

* 这边继承{@link GenericObjectPoolConfig}是为了ConnPool也可以进行个性化的配置

*

* @author WangJun

* @version 1.0 15/10/28

* @since 1.6

*/

public class ConnPoolConfig extends GenericObjectPoolConfig {

public ConnPoolConfig() {

// defaults to make your life with connection pool easier :)

setMinIdle(5);

setTestOnBorrow(true);

}

}

有了创建对象的工厂,我们就可以创建一个对象池实例

package com.peaceful.pool.demo;

import org.apache.commons.pool2.impl.GenericObjectPool;

/**

* common-pool2 使用方式

*

* Conn对象管理池,这里利用GenericObjectPool作为对象池

*

* @author WangJun

* @version 1.0 15/10/28

* @since 1.6

*/

public class ConnPool extends GenericObjectPool {

/**

* 调用{@link GenericObjectPool}的构造方法,构造ConnPool

*/

public ConnPool() {

super(new ConnFactory(), new ConnPoolConfig());

}

/**

* 调用{@link GenericObjectPool}的构造方法,构造ConnPool

*/

public ConnPool(ConnPoolConfig connPoolConfig) {

super(new ConnFactory(), connPoolConfig);

}

}

这样一个就完成了整个ConnPool的编码,下面我们在写一个demo,演示使用ConnPool

public class ConnDemo {

public static void main(String[] args) throws Exception {

ConnPoolConfig connPoolConfig = new ConnPoolConfig();

connPoolConfig.setMinIdle(5);

connPoolConfig.setMaxIdle(8);

ConnPool connPool = new ConnPool(connPoolConfig);

Conn conn1 = connPool.borrowObject();

Conn conn2 = connPool.borrowObject();

Conn conn3 = connPool.borrowObject();

Conn conn4 = connPool.borrowObject();

Conn conn5 = connPool.borrowObject();

conn1.report();

connPool.returnObject(conn1);

conn2.report();

connPool.returnObject(conn2);

conn3.report();

connPool.returnObject(conn3);

conn4.report();

connPool.returnObject(conn4);

conn5.report();

connPool.returnObject(conn5);

conn5.report();

// 被归还的对象的引用,不可以在次归还

// java.lang.IllegalStateException: Object has already been retured to this pool or is invalid

try {

connPool.returnObject(conn5);

}catch (Exception e){

e.printStackTrace();

}

}

}

下面是ConnDemo的运行结果

[2015-10-28 14:56:06 DEBUG] {com.peaceful.pool.demo.Conn:18}- init conn suc...

[2015-10-28 14:56:07 DEBUG] {com.peaceful.pool.demo.Conn:18}- init conn suc...

[2015-10-28 14:56:07 DEBUG] {com.peaceful.pool.demo.Conn:18}- init conn suc...

[2015-10-28 14:56:08 DEBUG] {com.peaceful.pool.demo.Conn:18}- init conn suc...

[2015-10-28 14:56:08 DEBUG] {com.peaceful.pool.demo.Conn:18}- init conn suc...

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015366746

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367346

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015367853

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368354

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860

[2015-10-28 14:56:08 INFO ] {com.peaceful.pool.demo.Conn:22}-this is a available conn 1446015368860

java.lang.IllegalStateException: Object has already been retured to this pool or is invalid

at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:595)

at com.peaceful.pool.demo.ConnDemo.main(ConnDemo.java:37)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:606)

at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

INT32 proc_mem_config(HD_COMMON_MEM_INIT_CONFIG* p_mem_cfg, void* p_cfg, INT32 i, UINT32 vprc_output, UINT32 sensor_cnt) { HD_DIM* p_dim = (HD_DIM*)p_cfg; // config common pool (proc) p_mem_cfg->pool_info[i].type = HD_COMMON_MEM_COMMON_POOL; p_mem_cfg->pool_info[i].blk_size = vendor_common_mem_calc_max_buf_size(p_dim->w, p_dim->h, VPRC_OUT_FMT); // NOTE: dim need align to 16 for rotate buffer p_mem_cfg->pool_info[i].blk_cnt = 4 * sensor_cnt; if (vprc_output == VPRC_OUTPUT_VENC) { p_mem_cfg->pool_info[i].blk_cnt *= 2; } p_mem_cfg->pool_info[i].ddr_id = VIDEO_DDRID; i++; if (chip_name != NULL && strcmp(chip_name, "CHIP_NT98539A") == 0) { // config common pool (proc) p_mem_cfg->pool_info[i].type = HD_COMMON_MEM_COMMON_POOL; p_mem_cfg->pool_info[i].blk_size = vendor_common_mem_calc_max_buf_size(p_dim->w, p_dim->h, BNR_OUT_FMT); p_mem_cfg->pool_info[i].blk_cnt = 4 * sensor_cnt; if (vprc_output == VPRC_OUTPUT_VENC) { p_mem_cfg->pool_info[i].blk_cnt *= 2; } p_mem_cfg->pool_info[i].ddr_id = VIDEO_DDRID; i++; // config common pool (proc) p_mem_cfg->pool_info[i].type = HD_COMMON_MEM_COMMON_POOL; p_mem_cfg->pool_info[i].blk_size = vendor_common_mem_calc_max_buf_size(p_dim->w, p_dim->h, BNR_REF_FMT); p_mem_cfg->pool_info[i].blk_cnt = 3 * sensor_cnt; if (vprc_output == VPRC_OUTPUT_VENC) { p_mem_cfg->pool_info[i].blk_cnt *= 2; } p_mem_cfg->pool_info[i].ddr_id = VIDEO_DDRID; i++; p_mem_cfg->pool_info[i].type = HD_COMMON_MEM_COMMON_POOL; p_mem_cfg->pool_info[i].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_MAP_BUFSIZE(p_dim->w, p_dim->h, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer p_mem_cfg->pool_info[i].blk_cnt = 2 * sensor_cnt; if (vprc_output == VPRC_OUTPUT_VENC) { p_mem_cfg->pool_info[i].blk_cnt *= 2; } p_mem_cfg->pool_info[i].ddr_id = VIDEO_DDRID; i++; p_mem_cfg->pool_info[i].type = HD_COMMON_MEM_COMMON_POOL; p_mem_cfg->pool_info[i].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_BUFSIZE(p_dim->w, p_dim->h, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer p_mem_cfg->pool_info[i].blk_cnt = 3 * sensor_cnt; if (vprc_output == VPRC_OUTPUT_VENC) { p_mem_cfg->pool_info[i].blk_cnt *= 2; } p_mem_cfg->pool_info[i].ddr_id = VIDEO_DDRID; i++; } return i; }
09-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值