在 Kotlin 中是否有与 C# 的 Semaphore/SemaphoreSlim 类型等效的类型?我想将它与协同程序(非阻塞)一起使用。即 WaitOneAsync()。
问问题
904 次
3 回答
4
kotlinx-coroutines
现在有一个成熟的Semaphore
班级。
您可以按如下方式使用它:
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit
suspend fun doConcurrently(list: List<Something>) {
val semaphore = Semaphore(4) // number of permits is 4
list
.map { async { semaphore.withPermit { /* do something */ } } }
.awaitAll()
}
于 2021-03-29T12:43:36.777 回答
2
您有一些来自 Java 的选项。
最常见的是使用CountDownLatch
:
val latch = CountDownLatch(1)
async {
// Do something
latch.countDown()
}
latch.await()
通常这就足够了。
如果你有一些非常具体的情况,你也可以使用信号量,当然:
launch {
try {
semaphore.acquire()
// Do something
}
finally {
semaphore.release()
}
}
于 2018-07-31T19:16:54.273 回答
2
您可以考虑使用 Kotlin 自己的Job.join()
方法。好处是这join
是一个suspsend
功能,不需要额外的async
块
val latch: CompletableJob = Job()
launch {
latch.join()
}
准备就绪时调用:
latch.complete()
此外,如果您需要超时,您可以将join
呼叫包装到withTimeout
或withTimeoutOrNull
另一个有用的 Kotlin 接口是CompletableDeferred
. 不像Job
它返回完成结果。查看它的await/complete
方法
于 2020-06-30T10:46:31.137 回答