上QQ阅读APP看书,第一时间看更新
1.1.2 异步与回调
从不同的角度来审查我们的程序,得出的结论也不同。如果只取其中很小的一段,那么多数情况下我们能看到的也不过只是一段顺序执行的指令,如代码清单1-1所示。
代码清单1-1 同步代码
println("A") println("B")
但如果多看些代码,情况也许就变得不一样了,如代码清单1-2所示。
代码清单1-2 异步代码
val task = { println("C") } println("A") thread(block = task) println("B")
尽管看上去task先传给thread调用,但B和C却不一定哪个先输出。
异步任务可能很耗时(例如I/O任务),也可能因为某种原因不能立即执行(例如延时任务),我们不希望它阻碍程序主流程。等异步任务执行完毕,如果调用者关心结果,那么就要通过回调通知调用者,如代码清单1-3所示。
代码清单1-3 异步回调
val callback = { println("D") } val task = { println("C") callback() // ... ① } println("A") thread(block = task) println("B")
我们定义了一个callback,并在task执行完毕后的①处调用这个callback,让调用者收到这个事件。以上程序的执行流程如图1-2所示。
图1-2 异步回调
当然,实践当中通常会涉及从C到D的过程中的线程切换,主流程执行到B时可能通过执行某种操作开始等待异步任务,直到在D处将异步任务转回主流程。
提示 thread函数是Kotlin标准库中对Java Thread的封装,调用后默认立即启动线程执行。