首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科特林的ObjectPool

科特林的ObjectPool
EN

Stack Overflow用户
提问于 2021-09-30 19:08:50
回答 1查看 401关注 0票数 0

我希望在Kotlin中使用一个对象池,并希望使用类似于apache共用池的开源库。我之所以不使用apache共用池的唯一原因是因为它的借用方法是阻塞的。我想要一个具有以下特性的游泳池

  1. 设置maxIdle对象
  2. 清理已闲置太久的对象
  3. 创建对象,直到达到池容量(如果有更多的需求)
  4. 不允许用户泄漏对象。

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

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

那我的要求是什么?

  1. 如何采用Ktor的DefaultObject池来实现上述目标
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-30 19:47:16

只是一个想法,使共用池提供一个暂停借款的方法。我没有花太多时间去推理,所以我不能保证这是完全有意义的。但是我的想法是,既然它已经尝试按照请求对象的顺序来释放线程,那么让所有请求都放在同一个线程上应该是好的,而coroutines将按照所请求的顺序接收它们的对象。因此,您可以将单个线程分派程序附加到单个池。缺点是,即使池尚未耗尽,也会短暂地挂起交换线程。

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69397678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档