ObjectPool in Kotlin



我想在Kotlin中使用对象池,并且更喜欢类似于apache commons pool的开源库。我不使用apache公共池的唯一原因是它的借用方法是阻塞的。我想要一个具有以下功能的池

  1. 设置maxIdle对象
  2. 清除空闲时间过长的对象
  3. 创建对象,直到达到池容量(如果有更多需求)
  4. 不允许用户泄漏对象

我在网上搜索了想法,这个实现非常非常接近我想要的。我不使用的原因是它是基于实验性的API。我也不高兴我需要启动一个无限循环来处理对象借用和回收,因为如果这个循环失败,整个池就死了。我更喜欢方法borrow()recycle()是基于对对象的需求来执行的。

最后,我查看了Ktor中实现的ObjectPool,但我不明白如何实现借用和回收。有人可以解释pushTop()popTop()的方法是如何工作的吗?或者给我指出关于这里应用的概念的正确文献。我想如果我能弄清楚借用和回收方法是如何工作的,我就可以采用这个方法。

那么我的要求是什么?

  1. 我如何采用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)

相关内容

  • 没有找到相关文章

最新更新