为了搞清楚协程与线程的关系,我们首先要弄懂一个问题:什么叫做切线程?
首先看代码:
// Thread1.kt
fun main() {
printlnWithThread("do work 1")
switchThread()
printlnWithThread("do work 3")
}
fun switchThread() = thread {
printlnWithThread("do work 2")
}
fun printlnWithThread(message: String) {
println("${Thread.currentThread().name}: $message")
}
代码运行结果如下:
main: do work 1 main: do work 3 Thread-0: do work 2 |
我们可以看到:switchThread 中使用的 thread 方法为 kotlin 对 new Thread and start 的封装,从 log 可以看到 work2 的确在是新线程上运行的,所以我们切换线程成功。
但因为工作之间往往有顺序依赖性,并不是完全孤立的,比如我想先设置一个loading的状态,再从后台获取一个数据,最后再根据获取的数据在界面上展示出来,明显这个顺序是不能颠倒的。所以我们希望在“切”线程的时候依然能保证 sub work 之间的顺序性。
如果我们想要完成上面的这个任务,可以做如下修改:
// Thread2.kt
fun main() {
printlnWithThread("do work 1")
val newThread = switchThread2()
newThread.join()
printlnWithThread("do work 3")
}
fun switchThread2() = thread {
printlnWithThread("do work 2")
}
代码运行结果如下:
main: do work 1 Thread-0: do work 2 main: do work 3 |
现在工作流程符合我们的要求了,“切”线程成功。