kotlin——launch&runblocking&async

协程

  协程是语言层面的东西,线程是系统层面的东西

  协程,本质上是一个线程框架,解决了异步编程时过多回调的问题

  线程的切换会耗费系统资源,协程可以理解为线程里的‘多线程’,当然我们也可以直接理解这里的协程是线程,底层实现我们可以不深究

launch和runblocking

  launch和runblocking,都可以在kotlin开启协程,区别在于launch是非阻塞的runblocking是阻塞的

  这里有个语法糖则是在kotlin中,函数的最后一个参数函数的话,可以使用大括号放在函数调用的后面,若前面参数不传递或只有这一个参数,则函数调用的小括号也可以省略,像list里的filter和map等函数都可以这么干

launch

  launch开启的是一个非阻塞协程,程序不会等launch的代码执行完才往后执行

CoroutineScope(Dispatchers.Main).launch{
  delay(500)     //延时500ms
}

  协程体里的任务时就会先挂起(suspend),让CoroutineScope.launch后面的代码继续执行,直到协程体内的方法执行完成再自动切回来所在的上下文回调结

  参数的意思是协程体里的代码运行在主线程,若参数为Dispatchers.IO则是运行在子线程里

runblocking

  runblocking从名字就可以看出来,关于阻塞的一个函数,runblocking可以启动阻塞的协程

runBlocking{
    delay(500)    //延时500ms
}

  这段代码中主线程会立即执行runBlocking代码块里的任务,执行完了才会继续执行下面的代码

  那就有疑问了,程序是顺序执行的,加不加runblocking又有什么区别呢

  但我们如果在runBlocking里面再开启子协程搭配async使用,就能达到主线程等待runblocking,runblocking等待子协程执行完的效果

async

  async是有返回值的协程调用方式,async的返回值是Deferred<T>,是延迟的意思

    fun testAsync() {
        runBlocking {
            //启动协程
            var job = GlobalScope.async {
                println("job1 start")
                Thread.sleep(10000)
                //返回值
                "fish"
            }
            //等待协程执行结束,并返回协程结果
            var result = job.await()
            println("result:$result")
        }
    }

  Deferred的await可以拿到协程的返回结果,需要注意的是这个的await是不会阻塞的,只是挂起的意思,指只是将这个方法的执行给暂停了,等一会获取到结果再继续执行 

fun main() {
    println("main start")
    val res = runBlocking {
        val res1 = async {
            1
        }
        val res2 = async {
            2
        }
        res1.await() + res2.await()
    }
    println(res)
    println("main end")
}

  像这样我们在runBlocking里面用了两个async协程,然后通过await的方式拿到返回值返回给res

  所以async和runblocking搭配一起使用,可以达到开启多个协程异步执行操作,然后通过await拿到返回值,处理完你的业务逻辑,最后再继续执行主线程runblocking后面的代码的效果

references

https://juejin.cn/post/7128961903220490270

https://blog.csdn.net/zhong_zihao/article/details/105145206

https://juejin.cn/post/7107261954191785992

https://juejin.cn/post/7023806836696416293

https://juejin.cn/post/7108651566806073380

 

posted @ 2023-03-09 00:28  艾尔夏尔-Layton  阅读(428)  评论(0编辑  收藏  举报