对一个从来都不了解协程的人来说,如果他问你什么是协程,我可能一个笼统的回答就是:协程就是轻量级的线程。
java中的线程和linux系统里面的线程是一一对应的,所以java里面的线程存在上下文,栈,程序计数器等概念。那kotlin中的协程和系统中的线程又是什么关系呢?首先明白一点就是协程肯定是运行在线程里面的,协程对于使用者来说它可以实现和线程一样的异步效果,同样存在线程安全的问题,但是协程的异步实现感知上来看是一个顺序的过程,不会有类似回调啊什么东西,代码更容易理解了。
协程和线程不是一一对应的,线程到底在那个线程运行和协程的调度器有关系。协程里面有四种调度器:
1.Dispatchers.Main:主线程中运行
2.Dispatchers.IO:处理IO相关的操作
3.Dispatchers.Default:处理CPU密集型的操作
3.Dispatchers.Unconfined:未定义的,未知的,可能运行在主线程,也可以运行在别的线程。
使用也很简单如下:
this.lifecycleScope.launch(Dispatchers.IO){
Log.i("test","IO--default:${Thread.currentThread().name}
}
但是有一种情况大家看看:
this.lifecycleScope.launch(Dispatchers.IO){
launch {
Log.i("test","IO--default:${Thread.currentThread().name}")
}
}
请问未指定调度器的协程是运行在那个线程里面?
在没有指定调度器的情况下,默认他的调度器和父的调度器相同。有如下代码:
this.lifecycleScope.launch(Dispatchers.Main){
launch {
Log.i("test","main--default:${Thread.currentThread().name}")
}
}
this.lifecycleScope.launch(Dispatchers.IO){
launch {
Log.i("test","IO--default:${Thread.currentThread().name}")
}
}
this.lifecycleScope.launch(Dispatchers.Default){
launch {
Log.i("test","Default--default:${Thread.currentThread().name}")
}
}
this.lifecycleScope.launch(Dispatchers.Unconfined){
launch {
Log.i("test","Unconfined--default:${Thread.currentThread().name}")
}
}
看看这个代码的运行结果是什么:
I/test: Default--default:DefaultDispatcher-worker-4
I/test: Unconfined--default:main
I/test: IO--default:DefaultDispatcher-worker-2
I/test: main--default:main
可以看出和父的调度器是相同的。
前两天走查代码,发现很多地方都没有指定调度器,打log发现有些确实是运行主线程里面的,这样可能引起主线程比较繁忙。



