kotlin coroutine 和 asyncTask class 和 multiThread 之间有什么区别

what is difference between kotlin coroutine and asyncTask class and multiThread

我最近和现在都在阅读有关 Kotlin 协程的内容,我想知道 asyncTask class 与多线程编程和协程之间有什么区别?在什么情况下我应该使用每一个?

AsyncTask 是抽象的 class 并且必须被子classed。 AsyncTask 有 4 个步骤:onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute。 它们在单个后台线程上串行执行。

  • 如果你想获取URL或在Android中执行重量级计算,你必须使用异步编程。

  • 当有小任务与主线程通信时可以使用它们。 对于并行使用多个实例的任务。

线程是并发执行单元。它有自己的调用堆栈。 对于线程,操作系统根据其调度程序抢先切换 运行 个线程。

  • 它们可用于任务运行宁可并行使用多线程。

  • 对于您想要控制 CPU 相对于 GUI 线程的使用的任务。

协程 用于编写看起来像正常顺序代码的异步代码。 它们可以以极低的开销提供非常高级别的并发性。

  • 它们易于阅读,与线程不同,它们是轻量级的,并且与 AsyncTask 不同,它们中的很多可以同时 运行。

AsyncTask 是 Google 在 Android SDK 中提出的第一手解决方案,目的是在后台处理工作,同时保持主线程免受许多复杂操作的影响。事实上,AsyncTask 让你以异步的方式进行复杂的处理。与 classical Java Thread 相比,AsyncTask 在某种程度上是专门的,提供 UI 线程包装器,以便作为开发人员获得更愉快的体验,以异步方式编码。 AsyncTask class 同时被弃用,推荐的解决方法是使用协程。

Coroutines 并不是 Kotlin 引入的新概念,事实上这个概念存在于很多编程语言中(Go 有 Goroutines Java 将提供名为 Fibers 的东西)。使用协程的主要优点是代码简单,面对异步 task/function 的唯一区别是同步 task/function 是在函数前面使用 suspend 关键字. 例如下面的函数是同步执行的:

fun doSomething() = println("Print something")

而以下是异步执行的,由于使用了suspend关键字:

suspend fun doSomething()  = println("Print something")

当到达 suspend 函数时,程序不会在那里阻塞,并会在 运行 代码的其余部分继续执行,但会收到一个 Continuation,它将return 挂起函数可用时计算的值。