0
点赞
收藏
分享

微信扫一扫

Kotlin协程——协程与线程的关系

为了搞清楚协程与线程的关系,我们首先要弄懂一个问题:什么叫做切线程?

首先看代码:

// 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

现在工作流程符合我们的要求了,“切”线程成功。

举报

相关推荐

0 条评论