【发布时间】:2021-01-26 02:09:11
【问题描述】:
我想使用 Kotlin 协程来调用阻塞函数。
例如,我想要一个挂起函数,它会“阻塞”直到用户响应模态对话框,或者直到网络调用返回,此时对话框和网络库不提供 suspend 函数。
我使用Mutex 实现了它。
例如,对于阻塞网络调用的场景,我做了这样的事情:
class Connection {
private val mutex = Mutex()
public suspend fun receive(): ByteArray {
mutex.lock()
val buf = ByteArray(42)
thread {
sock.getInputStream().read(buf, 0, 42) // blocking
mutex.unlock()
}
mutex.lock()
return buf
}
}
有效。
请忽略上述代码中与网络相关的问题(如错误处理、检查实际读取的字节数等)。
还请忽略使用线程的性能方面(上面的专用线程只是为了举例)。
从使用Mutex 将阻塞流“转换”为协程流的角度来看:
- 是否有标准或更好的方法来做到这一点?
- 除了网络或性能 - 您认为我的方法有什么缺点吗?
【问题讨论】:
-
你的意思是像
runBlocking这样会阻塞线程直到操作完成? -
@R'J 看起来可行:)
-
阻塞线程并不是真正推荐的使用 Kotlin 协程处理事情的方法。它们非常通用,您可以在没有阻塞线程的情况下获得结果,所以我建议查看下面的人写的内容,特别是使用
IOdispatcher