3

在 Kotlin 中是否有与 C# 的 Semaphore/SemaphoreSlim 类型等效的类型?我想将它与协同程序(非阻塞)一起使用。即 WaitOneAsync()。

4

3 回答 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呼叫包装到withTimeoutwithTimeoutOrNull

另一个有用的 Kotlin 接口是CompletableDeferred. 不像Job它返回完成结果。查看它的await/complete方法

于 2020-06-30T10:46:31.137 回答