我想在Kotlin中使用对象池,并且更喜欢类似于apache commons pool的开源库。我不使用apache公共池的唯一原因是它的借用方法是阻塞的。我想要一个具有以下功能的池
- 设置maxIdle对象
- 清除空闲时间过长的对象
- 创建对象,直到达到池容量(如果有更多需求)
- 不允许用户泄漏对象
我在网上搜索了想法,这个实现非常非常接近我想要的。我不使用的原因是它是基于实验性的API。我也不高兴我需要启动一个无限循环来处理对象借用和回收,因为如果这个循环失败,整个池就死了。我更喜欢方法borrow()
和recycle()
是基于对对象的需求来执行的。
最后,我查看了Ktor中实现的ObjectPool,但我不明白如何实现借用和回收。有人可以解释pushTop()
和popTop()
的方法是如何工作的吗?或者给我指出关于这里应用的概念的正确文献。我想如果我能弄清楚借用和回收方法是如何工作的,我就可以采用这个方法。
那么我的要求是什么?
- 我如何采用Ktor的
DefaultObject
池来实现我上面提到的目标
只是一个让Commons Pool提供暂停借用方法的想法。我没有花很多时间来推理,所以我不能保证它完全有意义。但我的想法是,因为它已经尝试解锁线程在他们请求对象的顺序,它应该是好的,让所有的请求进入同一线程和协程将接收他们的对象在相同的顺序,他们被请求。因此,您可以将单个线程分派器附加到单个池。缺点是,即使池没有耗尽,它最终也会短暂挂起以交换线程。
class SuspendingObjectPool<T>(private val sourcePool: ObjectPool<T>) : ObjectPool<T> by sourcePool {
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
suspend fun borrowObjectSuspending(): T = withContext(dispatcher) { borrowObject() }
}
fun <T> ObjectPool<T>.asSuspendingObjectPool() = SuspendingObjectPool(this)