我希望使用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
这样的东西,它会阻塞线程直到操作完成吗? - Vitaliy-TIO
调度程序。 - Vitaliy-T