【问题标题】:Are Kotlin callback functions multi-threaded?Kotlin 回调函数是多线程的吗?
【发布时间】:2020-11-16 19:51:29
【问题描述】:

在下面的示例中(来自 Kotlin 文档),有嵌套的回调函数。

假设在主线程上调用了postItem,那么在调用preparePostAsync 之后,主线程是否会立即继续执行而不等待preparePostAsync 完成?

如果是,这是否意味着 Kotlin 实际上是在回调函数的掩护下执行多线程? (假设这是真的,是不是意味着回调数=线程数?)

fun postItem(item: Item) {
    preparePostAsync { token -> 
        submitPostAsync(token, item) { post -> 
            processPost(post)
        }
    }
}

如果和多线程无关,那么回调函数和多线程有什么区别?

【问题讨论】:

  • 这与 Kotlin 正在做什么无关,而与 preparePostAsyncsubmitPostAsync 的实现所做出的决定有关。这些函数可能会在其他线程上调用这些回调,也可能不会; Kotlin 不会为他们做出这个决定。

标签: multithreading kotlin callback


【解决方案1】:

这完全取决于您使用的 API。文档中的这些示例是虚构的,不是标准库的一部分。

通常,当一个函数接受回调时,它会在请求入队后立即返回,并在返回结果时调用主线程上的回调。

像 OkHttp 这样的网络库在后台使用线程池,因此运行的后台线程与发出的请求数不一定一一对应。

“回调”一词只是遵循此模式的异步任务的非正式名称。

【讨论】:

  • 所以回调与多线程无关,除非有像 OkHttp 这样的显式用法。在回调链中没有网络连接或线程创建的情况下,主线程首先将执行回调链中的所有内容,然后才执行回调链之外的以下代码?另一方面,如果回调链在其间使用了新线程,那么主线程会暂停执行回调链,并将执行代码切换到回调链之外,直到新线程执行完毕?
  • “回调”是模式的非正式术语。您可以编写一些遵循类似模式但行为不典型的东西。您可以编写一个带有“回调”参数的函数并简单地立即调用它,但它不符合回调的概念,而且毫无意义。
  • UI 框架(如 Android 或 Swing 或 JavaFX)的主线程有一个消息队列。通常,异步回调函数完成它们的工作,然后将回调发布到主线程队列,所以即使带回调参数的函数不做多线程,当它发布回调代码到队列时,它也不会运行直到当前在主线程队列中的所有内容都已经完成。回调模式有时用于 UI 绘图/动画事件,这并不真正涉及多线程。
猜你喜欢
  • 1970-01-01
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多