例子一:
GlobalScope.launch(Dispatchers.Main) { //开启子协程 withContext(Dispatchers.IO) { for (i in 0 until 1000) { } Log.d("MainActivityXX", "withContext-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "GlobalScope-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "onCreate-> thread:" + Thread.currentThread().name)
打印log:
2022-10-09 20:24:21.100 8371-8371/com.example.xiecheng D/MainActivityXX: onCreate-> thread:main
2022-10-09 20:24:21.131 8371-8412/com.example.xiecheng D/MainActivityXX: withContext-> thread:DefaultDispatcher-worker-1
2022-10-09 20:24:21.258 8371-8371/com.example.xiecheng D/MainActivityXX: GlobalScope-> thread:main
例子二:
GlobalScope.launch(Dispatchers.Main) { //开启子协程 withContext(Dispatchers.IO) { for (i in 0 until 1000) { } Log.d("MainActivityXX", "withContext1-> thread:" + Thread.currentThread().name) withContext(Dispatchers.IO) { for (i in 0 until 1000) { } Log.d("MainActivityXX", "withContext2-> thread:" + Thread.currentThread().name) } } withContext(Dispatchers.IO) { for (i in 0 until 1000) { } Log.d("MainActivityXX", "withContext3-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "GlobalScope-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "onCreate-> thread:" + Thread.currentThread().name)
打印log:
onCreate-> thread:main withContext1-> thread:DefaultDispatcher-worker-1 withContext2-> thread:DefaultDispatcher-worker-1 withContext3-> thread:DefaultDispatcher-worker-1 GlobalScope-> thread:main
主线程开启一个协程,并不会阻碍主线程的执行,单个协程内部是串行执行的,这里整一个都是串行执行的是因为withContext是一个挂起函数。
GlobalScope.launch(Dispatchers.Main) { //开启子协程 GlobalScope.launch (Dispatchers.IO) { Log.d("MainActivityXX", "withContext-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "GlobalScope-> thread:" + Thread.currentThread().name) }
打印log:
GlobalScope-> thread:main
withContext-> thread:DefaultDispatcher-worker-1
例子二:
GlobalScope.launch(Dispatchers.Main) { //开启子协程 withContext(Dispatchers.IO) { get() Log.d("MainActivityXX", "withContext-> thread:" + Thread.currentThread().name) } Log.d("MainActivityXX", "GlobalScope-> thread:" + Thread.currentThread().name) }
suspend fun get() {
Thread {
Thread.sleep(5000)
Log.d("MainActivityXX", "get-> thread:" + Thread.currentThread().name)
}.start()
}
打印log:
2022-11-01 20:56:25.220 20058-20100/com.example.xiecheng D/MainActivityXX: withContext-> thread:DefaultDispatcher-worker-1
2022-11-01 20:56:25.264 20058-20058/com.example.xiecheng D/MainActivityXX: GlobalScope-> thread:main
2022-11-01 20:56:30.222 20058-20103/com.example.xiecheng D/MainActivityXX: get-> thread:Thread-8
协程里面开启线程,那么线程不会受协程影响。
例子三:
GlobalScope.launch(Dispatchers.Main) { fetchDocs() } suspend fun fetchDocs() { // Dispatchers.Main val result = g