Kotlin协程学习(三):协程的非阻塞式挂起是什么?

Kotlin 协程的 非阻塞式挂起是什么?

什么事非阻塞式:不卡当前线程。

Kotlin 协程的非阻塞原因:

因为使用挂起函数会切换线程,既然切换了线程,那么肯定就不卡当前线程了。

其实线程也是非阻塞式的

线程中的阻塞式是 在单线程 下,在单线程下执行耗时操作是会阻塞线程的,如果在多线程情况下,那么此时的线程也是非阻塞式的。

但是 Kotlin 协程在 单协程的情况下也是非阻塞式 的,因为它可以利用挂起函数来切换线程。

协程是一种 看起来阻塞,但是其实是非阻塞 的写法,因为它有挂起函数。

看起来阻塞:是因为确实你没有看到相关线程切换的代码,为顺序执行的代码。
其实是非阻塞:是因为挂起函数可以自动帮助我们完成线程切换。

协程和线程的关系

在 Kotlin 中协程是 基于线程而实现的一套更上层的工具 API,为基于线程的上层框架,类似 Executors ,并且和 Executors 的性能也差不多,所以 “轻量级线程说法,比线程更高效” 这种说法有待商榷。

总结

协程:就是切线程
挂起:可以自动切回来的切线程
非阻塞:协程可以用看起来阻塞的代码写出非阻塞式的操作


知识链接

到底什么是「非阻塞式」挂起?协程真的比线程更轻量级吗?