作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用Kotlin协程来处理非阻塞I / O。方案如下:
private var latch = CountDownLatch(1)
private var data: Any? = null
// Async callback from non-blocking I/O
fun onReceive(data: Any) {
currentData = data
latch.countDown()
}
// Wait and consume data
fun getData(): Any? {
latch.await()
latch = CountDownLatch(1)
return currentData
}
fun processData() {
launch(CommonPool) {
while (true) {
val data = getData()
// Consume data
}
}
}
// Wait and consume data
fun getData() = async(CommonPool) {
latch.await()
latch = CountDownLatch(1)
currentData
}
fun processData() {
launch(CommonPool) {
while (true) {
runBlocking {
val data = getData().await()
// Consume data
}
}
}
}
最佳答案
您没有说onReceive()
中接收的数据是否可以并行处理。这是主要问题。如果是,则可以使用onReceive()
进行操作。如果不允许这样做,则让每个对onReceive()
的调用都在CommonPool
上启动一个没有任何协程的任务。如果应该顺序处理它们,那么最简单的方法是使用内部循环来启动线程:
fun onReceive(data: Any) {
queue.put(data);
}
....
// loop in a thread
while(true) {
data = queue.take();
processData(data);
}
关于multithreading - Kotlin:使用非阻塞I/O阻塞协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163874/
我是一名优秀的程序员,十分优秀!