我希望在Kotlin中使用一个对象池,并希望使用类似于apache共用池的开源库。我之所以不使用apache共用池的唯一原因是因为它的借用方法是阻塞的。我想要一个具有以下特性的游泳池
我在互联网上搜索了一些想法,这一实现非常接近我想要的东西。我之所以不使用它,是因为它是基于实验性API的。我也不高兴我需要启动一个无限循环来处理对象的借用和回收,因为如果这个循环失败,整个池就死了。我更喜欢基于对象的需求来执行borrow()和recycle()方法。
最后,我查看了在ObjectPool中实现的Ktor,但是我不明白如何实现looked和回收站。也许有人能解释一下这一方法pushTop()和popTop()是如何工作的,或者只是指出关于这里应用的概念的正确文献。我想,如果我能弄清楚借入和回收的方法是如何运作的,我就可以采用这个方法。
那我的要求是什么?
DefaultObject池来实现上述目标发布于 2021-09-30 19:47:16
只是一个想法,使共用池提供一个暂停借款的方法。我没有花太多时间去推理,所以我不能保证这是完全有意义的。但是我的想法是,既然它已经尝试按照请求对象的顺序来释放线程,那么让所有请求都放在同一个线程上应该是好的,而coroutines将按照所请求的顺序接收它们的对象。因此,您可以将单个线程分派程序附加到单个池。缺点是,即使池尚未耗尽,也会短暂地挂起交换线程。
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)https://stackoverflow.com/questions/69397678
复制相似问题