Kotlin中是否有可替代C# AutoResetEvent的同类实现?
Kotlin中可以根据技术栈场景选择对应的工具实现类似WaitOne的等待逻辑,同时满足循环执行方法、每次获取返回值的需求,具体实现方案如下:
方案1:传统线程场景(无协程)
Kotlin/JVM平台可以直接复用JDK提供的CountDownLatch实现等待逻辑,示例代码如下:
import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit fun exampleMethod(): String{ var command = "example string" // 此处添加字符串处理逻辑 return command } fun main() { // 可自定义循环终止条件替换true while (true) { // 初始化计数为1的CountDownLatch,实现单次等待能力 val latch = CountDownLatch(1) var commandResult: String? = null // 模拟异步执行任务的场景 Thread { commandResult = exampleMethod() latch.countDown() // 任务执行完成后释放等待 }.start() // 等效于WaitOne方法,可自定义超时时间,此处设置为10秒 val waitSuccess = latch.await(10, TimeUnit.SECONDS) if (waitSuccess && commandResult != null) { // 此处处理拿到的command返回值 println("本次获取到的command值:$commandResult") } // 可自定义间隔时间,避免循环空转 Thread.sleep(1000) } }
如果需要可重复使用的等待逻辑,也可以将CountDownLatch替换为CyclicBarrier。
方案2:Kotlin协程场景(推荐)
如果项目使用Kotlin协程,可以用更轻量的协程工具实现等待,不会阻塞线程,性能开销更低:
import kotlinx.coroutines.* import kotlinx.coroutines.sync.Mutex fun exampleMethod(): String{ var command = "example string" // 此处添加字符串处理逻辑 return command } fun main() = runBlocking { // 协程活跃时持续循环 while (isActive) { // 异步启动任务,await方法等效于WaitOne,仅挂起不阻塞线程 val resultDeferred = async(Dispatchers.IO) { exampleMethod() } val commandResult = resultDeferred.await() // 此处处理拿到的command返回值 println("本次获取到的command值:$commandResult") // 可自定义间隔等待时间 delay(1000) } }
内容的提问来源于stack exchange,提问作者RaceyT
相关产品推荐
相关产品推荐

