迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Kotlin runBlocking:用协程代码桥接非协程世界

作者:迹忆客 最近更新:2023/05/10 浏览次数:

Kotlin runBlocking() 函数是一个阻塞主线程的挂起函数。 它有助于在同步代码和异步代码之间架起一座桥梁。

在本文中,我们将了解 Kotlin runBlocking() 及其在不同场景中的使用。


Kotlin 中的 runBlocking 函数

您可能听说过 Kotlin 中的 delay() 函数。 delay() 函数暂停协程并将其延迟特定时间。

但是,它不会阻塞整个线程。 这意味着当我们使用 delay() 函数时,我们仍然可以执行其他操作,例如在 UI 中进行更改。

另一方面,runBlocking() 函数会阻塞整个线程,直到它完成。 因此,在带有 runBlocking() 代码的线程完成之前,编译器不会执行任何其他操作。

Kotlin runBlocking() 函数启动的新线程是从主线程启动的。

为了理解这一点,让我们看两个示例代码。 在第一段代码中,我们将在 GlobalScope.launch() 中使用 delay() 函数。 在第二个示例中,我们将在 Kotlin runBlocking() 函数中使用它。

在 GlobalScope.launch() 中使用 delay()

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        GlobalScope.launch(Dispatchers.Main) {
            delay(5000)
            Log.d(TAG,"Global Scope")
            Toast.makeText(applicationContext,"Thread executed in global scope",Toast.LENGTH_SHORT).show()
        }
        Log.d(TAG,"Not Global Scope")
        Toast.makeText(applicationContext,"Thread executed is not in Global Scope",Toast.LENGTH_SHORT).show()
    }
}

当您在 Android Studio 中运行此类代码时,将执行标签“Not Global Scope”。 然后延迟 5 秒执行标签“Global Scope”消息。

这意味着只有延迟,但仍会执行操作。 因此,线程没有完全阻塞。

在 Kotlin runBlocking() 中使用 delay()

如前所述,当我们在 GlobalScope.launch() 中使用 delay() 函数时,整个线程并没有被阻塞。

但是当我们在 Kotlin runBlocking 中使用它时,线程会被阻塞,直到执行完 runBlocking 代码中的所有函数。 这里有一个例子来证明这一点。

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(TAG, "Prior using run blocking")
            runBlocking 
              {
              Log.d(TAG,"Entered run-blocking")
              delay(3000)

              Log.d(TAG,"Run-blocking started")
              Log.d(TAG,"Run-blocking ended")
            }
        Log.d(TAG,"Post using run blocking")
    }
}

当我们使用这段代码时,最后执行标签“Post using run blocking”。 原因是所有的执行都停止了,直到整个 runBlocking 代码被执行完。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Kotlin 中继承具有多个构造函数的类

发布时间:2023/05/12 浏览次数:200 分类:Java

本文讨论如何扩展具有多个构造函数的类。 构造函数是在创建对象时调用的函数,用于初始化类变量。在 Kotlin 中扩展具有多个构造函数的类

Kotlin中栈数据结构的使用

发布时间:2023/05/12 浏览次数:130 分类:Java

本篇文章我们就来学习一下Kotlin中栈的使用。 我们还将看到用于更新和更改 Kotlin 堆栈的标准函数,包括 push、pop、peek、search 和 isEmpty。我们还将研究比 Kotlin 中的堆栈更好的替代方案。

Kotlin中findViewById函数的使用

发布时间:2023/05/12 浏览次数:183 分类:Java

Kotlin 中的 findViewById 允许在 ID 的帮助下查看和更新视图。 本文介绍了 Kotlin 中 findViewById 函数的使用。

在 Java 中获取文件大小

发布时间:2023/05/01 浏览次数:139 分类:Java

Java 提供了不同的方法来获取文件的字节大小。 本教程演示了在 Java 中获取文件大小的不同方法。使用 Java IO 的文件类获取文件大小 Java IO 包的 File 类提供了以字节为单位获取文件大小的功能。

Java 中的文件分隔符

发布时间:2023/05/01 浏览次数:109 分类:Java

本篇文章介绍了 Java 中的文件分隔符。Java 中的文件分隔符 文件分隔符是用来分隔目录的字符; 例如,Unix 使用 /,Windows 使用 \ 作为文件分隔符。

Java 中的文件过滤器

发布时间:2023/05/01 浏览次数:194 分类:Java

本篇文章介绍如何在 Java 中使用 FileFilter。FileFilter 用于过滤具有特定扩展名的文件。 Java内置包IO和Apache Commons IO为FileFilter提供了类和接口来进行文件过滤操作。

Java 获取 ISO 8601 格式的当前时间戳

发布时间:2023/05/01 浏览次数:146 分类:Java

本篇文章介绍了 ISO 8601 日期格式、其重要性及其在 Java 中的使用。 它还列出了一些优点来强调为什么应该使用 ISO 格式来表示日期。

在 Java 中获取数组的子集

发布时间:2023/05/01 浏览次数:151 分类:Java

本篇文章介绍了几种在 Java 中获取数组子集的方法。使用 Arrays.copyOf() 方法获取数组的子集 使用 Arrays.copyOfRange() 方法获取数组的子集

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便