您现在的位置是:首页 >技术交流 >协程与线程网站首页技术交流
协程与线程
协程与线程
“协程是轻量级的线程”,这是官方的slogan
协程与线程的关系
启动一个协程的方式:
• GlobalScope.async { }
• runBlocking { }
协程是运行在线程之上的,因为电脑CPU只有线程的说法,没有协程的说法,协程是由程序语言自己创建的,所以协程最终也是运行到线程上的,于是我想知道前面的代码中,开100万个协程,是跑在一个线程上还是多个线程上?
输出结果中可以看到,开100万个协程,这些协程是运行在4个线程之上的,为什么是4个呢?因为我的电脑是4核4线程的
100万个协程可以当100万个线程用吗
Kotlin官方给我们举例说明了使用100万个协程比使用100万个线程便宜多了,那协程能代替线程吗?之前官方的示例中使用delay()函数了模拟耗时操作,delay函数是一个可暂停的函数,它的功能是把协程暂停,这样该条协程对应的线程就空闲了,这条线程就可以去处理其它的协程了,delay(1000)为迟延1秒,那1秒后恢复时,如果之前的那条线程被别的协程使用,而且没使用完呢,这会怎样?很明显,协程暂停之后,恢复时不一定能在原来的线程上恢复,因为你需要恢复时可能线程已经被占用着了。Kotlin使用了线程池,所以它会从线程池中取一条空闲的线程来恢复被暂停的协程,而线程池的大小默认是跟电脑的逻辑处理器数量一样的。
一个线程给多个协程轮流分配执行时间
从结果可知,因为我们有4个逻辑处理器,所以Kotlin默认线程池创建了4个线程。我们创建了10个协程,而一开始只有4个协程分配到了线程,另外6个协程就只能等着了,等到其中一个协程读取文件结束了,才又开始了一个新的协程去执行读取文件的操作。
总结:
• 使用协程时并不能简单的替换线程
• 协程中线程池的线程数默认为逻辑处理器的数量,似乎听说也可以配置协程的线程池使用任意数量的线程
• 协程中线程切换很好用,比如你从UI线程切换到IO线程,再由IO线程切换到UI线程时,不需要写回调函数,就像写同步一样,很爽!So,Kotlin中的协程是用来切换线程用的?
• 协程底层也是一个线程池来维护执行,只是将原来的多线程书写方式更加同步化;
• Kotlin的协程,其实可以看作是一种语法糖,将异步回调的书写方式同步化,底层其实依然是使用的线程池
• kotlin协程其实本质是一套线程切换方案
• 底层就是用handler切换到了主线程
参考文章:
Kotlin协程到底是如何切换线程的