对象池StackObjectPool使用

本文介绍StackObjectPool的构造方法及如何借取对象。构造方法接收对象工厂、最大空闲对象数和初始容量作为参数。borrowObject方法用于从对象池中获取对象,若池为空则通过工厂创建新对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 构造函数, 不要被initIdleCapacity 误解,调用构造函数时,并没有放入对象。
// initIdleCapacity为对象池指定一个初始的参考大小(当空间不够时会自动增长)。但在源码中没看到有什么用途。
// maxIdle : 即 returnObject(), 可保存的对象数目的上限。达到这个上限之后,再向池里送回的对象会被自动送去回收。
//  initIdleCapacity 要大于 maxIdle

public StackObjectPool(PoolableObjectFactory<T> factory, int maxIdle, int initIdleCapacity) {
    this._pool = null;
    this._factory = null;
    this._maxSleeping = 8;
    this._numActive = 0;
    this._factory = factory;
    this._maxSleeping = maxIdle < 0?8:maxIdle;
    int initcapacity = initIdleCapacity < 1?4:initIdleCapacity;
    this._pool = new Stack();
    this._pool.ensureCapacity(initcapacity > this._maxSleeping?this._maxSleeping:initcapacity);
}
public synchronized T borrowObject() throws Exception {
    this.assertOpen();
    Object obj = null;
    boolean newlyCreated = false;

    while(null == obj) {
        if(!this._pool.empty()) { //如果堆栈中有对象,则弹出
            obj = this._pool.pop(); 
        } else { // 如果堆栈中没有对象
            if(null == this._factory) {
                throw new NoSuchElementException();
            }

            obj = this._factory.makeObject(); //创建对象
            newlyCreated = true;
            if(obj == null) {
                throw new NoSuchElementException("PoolableObjectFactory.makeObject() returned null.");
            }
        }
        。。。。
    }



转载于:https://my.oschina.net/u/1537182/blog/670355

/** * 发送并等待响应.<br> * 注意:<br> * 1、发送消息时,设置一下synSeq,形如:xxPacket.setSynSeq(789798786)。synSeq不为空且大于0(null、等于小于0都不行)<br> * 2、对端收到此消息后,需要回一条synSeq一样的消息,所以业务需要在decode()方法中根据bytebuffer反解析出packet的synSeq值,并赋给XxPacket对象<br> * 3、对于同步发送,框架层面并不会帮应用去调用handler.handler(packet, channelContext)方法,应用需要自己去处理响应的消息包, *参考写法:tioConfig.getAioHandler().handler(packet, channelContext);<br> * * @param channelContext * @param packet 业务层必须设置好synSeq字段的值,而且要保证唯一(不能重复)。可以在tioConfig范围内用AtomicInteger * @param timeout * @return * @author tanyaowu */ @SuppressWarnings("finally") public static Packet synSend(ChannelContext channelContext, Packet packet, long timeout) { Integer synSeq = packet.getSynSeq(); if (synSeq == null || synSeq <= 0) { throw new RuntimeException("synSeq必须大于0"); } MapWithLock<Integer, Packet> waitingResps = channelContext.tioConfig.getWaitingResps(); try { waitingResps.put(synSeq, packet); synchronized (packet) { send(channelContext, packet); try { packet.wait(timeout); } catch (InterruptedException e) { log.error(e.toString(), e); } } } catch (Throwable e) { log.error(e.toString(), e); } finally { Packet respPacket = waitingResps.remove(synSeq); if (respPacket == null) { log.error("respPacket == null,{}", channelContext); return null; } if (respPacket == packet) { log.error("{}, 同步发送超时, {}", channelContext.tioConfig.getName(), channelContext); return null; } return respPacket; } }
最新发布
05-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值