Kotlin 协程协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kotlin 协程协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )相关的知识,希望对你有一定的参考价值。

文章目录





一、挂起函数串行执行



在协程体中 , 连续使用多个挂起函数 , 这些函数的执行是顺序执行的 , 挂起函数 1 执行完毕后 , 才执行 挂起函数 2 ;

package kim.hsl.coroutine

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

class MainActivity : AppCompatActivity()
    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking 
            // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程

            // measureTimeMillis 函数用于测量内部代码块执行的时间, 单位毫秒 ms
            val time = measureTimeMillis 
                val ret1 = hello1()
                val ret2 = hello2()
                Log.i(TAG, "两个返回值相加 $ret1 + ret2")
            
            Log.i(TAG, "挂起函数执行耗时 $time ms")
        
    

    suspend fun hello1(): Int 
        delay(200)
        return 1
    

    suspend fun hello2(): Int 
        delay(300)
        return 2
    

执行结果 : 最终执行结果为 577 ms ,

00:14:00.962  I  两个返回值相加 3
00:14:00.963  I  挂起函数执行耗时 577 ms





二、协程组合并发执行挂起函数



如果想要两个挂起函数并发执行 , 并且同时需要两个函数的返回值 , 则使用 async 协程构建器 , 启动两个协程 , 在协程体中执行两个并发函数 ;

代码示例 :

package kim.hsl.coroutine

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

class MainActivity : AppCompatActivity()
    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        runBlocking 
            // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程

            // measureTimeMillis 函数用于测量内部代码块执行的时间, 单位毫秒 ms
            val time = measureTimeMillis 
                val ret1 = async 
                    hello1()
                
                val ret2 = async 
                    hello2()
                
                Log.i(TAG, "两个返回值相加 $ret1.await() + ret2.await()")
            
            Log.i(TAG, "挂起函数执行耗时 $time ms")
        
    

    suspend fun hello1(): Int 
        delay(200)
        return 1
    

    suspend fun hello2(): Int 
        delay(300)
        return 2
    

执行结果 : 启动两个 async 协程 , 并发执行两个挂起函数 , 耗时 355 ms , 达到了并发执行减少执行时间的目的 ;

00:18:50.081  I  两个返回值相加 3
00:18:50.081  I  挂起函数执行耗时 355 ms

以上是关于Kotlin 协程协程启动 ③ ( 协程组合并发 | 挂起函数串行执行 | 协程组合并发执行挂起函数 )的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 协程协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

Kotlin 协程协程底层实现 ③ ( 结构化并发 | MainScope 作用域 | 取消协程作用域 | Activity 实现 CoroutineScope 协程作用域接口 )

Kotlin 协程协程异常处理 ③ ( 协程异常处理器 CoroutineExceptionHandler 捕获异常 | 验证 CoroutineScope 协程的异常捕捉示例 )

Kotlin 协程协程异常处理 ③ ( 协程异常处理器 CoroutineExceptionHandler 捕获异常 | 验证 CoroutineScope 协程的异常捕捉示例 )

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )

Kotlin 协程协程启动 ⑤ ( 协程作用域构建器 | runBlocking 函数 | coroutineScope 函数 | supervisorScope 函数 )