【发布时间】:2021-11-09 17:34:36
【问题描述】:
为了重述标题,我想知道是否有办法将下面的MyThread 类转换为 Kotlin 协程。
如果您仔细观察,您会注意到MyThread 类有一个名为someObject 的属性变量,可以从run 和cancel 方法内部进行修改。在这种情况下,SomeObject 完全封装在 MyThread 中,我想保持这种状态。有没有办法将MyThread 转换为协程,还是我已经拥有最优雅的代码版本?
class MyCancellable: Thread(){
val someObject= SomeObject()
override fun run() {
super.run()
while(someObject.keepGoing){
someObject.value++
}
}
fun cancel(){
someObject.keepGoing=false
}
}
【问题讨论】:
-
“将其转换为协程没有任何优势”-> 除非您想要协程可以为您提供的许多功能,包括但不限于基于范围的生命周期感知取消。 ..
-
是的,我认为我把这个问题误读为关于性能的问题。
-
我要强调的一点是我是否能够通过另一种方法,即
cancel()来修改完全封装的someObject。这是协程不明显的唯一原因,不是吗?否则,如果这个线程只包含一个run方法,我可以很容易地用协程替换它。 -
我无法理解您在此状态下的用例。看看你如何使用这个类会很有用。如果
someObject是共享的可变状态(看起来确实如此),那么可能有更好的方法来使用协程组织代码。请注意,只要您使主循环协作,您就可以使用协程本身的取消机制而无需像这样的手动工作 -
好吧,假设
someObject是ServerSocket。在run方法中,我将调用serverSocket.accept(),这是一个阻塞调用。在等待连接到网络时,我可能会出于多种原因改变主意,在这种情况下,我需要致电serverSocket.close()。
标签: multithreading kotlin kotlin-coroutines