对一个从来都不了解协程的人来说,如果他问你什么是协程,我可能一个笼统的回答就是:协程就是轻量级的线程。
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}") } }
请问未指定调度器的协程是运行在那个线程