Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?

简介: 本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

Kotlin 中的 delay 函数和 Java 中的 Thread.sleep 都用于暂停代码执行,但是它们用于不同的场景,并且有不同的实现和影响。理解它们的不同点能帮助我们在合适的场景中选择合适的工具来提升效率和代码的可读性。

Thread.sleep 简介

Thread.sleep 是 Java 提供的方法,用于暂停当前线程的执行。它是一个阻塞操作,会冻结当前线程一段时间。

try {
   
    Thread.sleep(1000); // 暂停 1 秒
} catch (InterruptedException e) {
   
    e.printStackTrace();
}

在 Kotlin 中使用 Thread.sleep

fun main() {
    println("Start")
    Thread.sleep(1000) // 暂停 1 秒
    println("End")
}

delay 简介

delay 函数是 Kotlin 协程库(Kotlin Coroutines)提供的一个挂起函数,用于暂停协程的执行而不会阻塞线程。

import kotlinx.coroutines.*

fun main() = runBlocking {
    println("Start")
    delay(1000) // 暂停 1 秒
    println("End")
}

详细对比

以下是 delayThread.sleep 在实现方式和应用场景中的详细对比:

1. 阻塞 vs 非阻塞

  • Thread.sleep: 阻塞当前线程,线程被暂停,不能执行其他任务。

    fun main() {
        println("Before sleep")
        Thread.sleep(1000) // 阻塞当前线程 1 秒
        println("After sleep")
    }
    
  • delay: 非阻塞,在此期间可让出线程执行其他协程任务。

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        println("Before delay")
        delay(1000) // 挂起 1 秒,但不会阻塞线程
        println("After delay")
    }
    

2. 多任务处理

  • Thread.sleep: 如果当前线程内有多个任务,使用 sleep 会阻塞所有任务。

    fun main() {
        println("Task 1 start")
        Thread.sleep(1000)
        println("Task 1 end")
    
        println("Task 2 start")
        Thread.sleep(1000)
        println("Task 2 end")
    }
    
  • delay: 在协程中,使用 delay 不会阻塞线程,可以让其他协程继续执行。

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch {
            println("Task 1 start")
            delay(1000)
            println("Task 1 end")
        }
    
        launch {
            println("Task 2 start")
            delay(1000)
            println("Task 2 end")
        }
    
        delay(2000) // 主协程等待所有任务完成
    }
    

3. CPU 资源的有效利用

  • Thread.sleep: 在使用 sleep 时,线程暂停,占用的资源不能被释放和共享。

  • delay: 在协程中使用 delay 可以释放线程的资源,让其他任务可以被调度,因此更有效地利用 CPU。

结论

  • Thread.sleep:适用于简单的同步操作,线程处于阻塞状态,使用非常容易,但会导致资源不能被其他任务利用。
  • delay:是协程中的挂起函数,不阻塞线程,适用于并发和异步任务,可以高效利用系统资源。这也是 Kotlin 推荐在协程中使用 delay 而不是 Thread.sleep 的原因。

理解 delayThread.sleep 的区别可以更好地选择合适的方法来实现并发和异步任务,从而提升应用的性能和可维护性。


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
13天前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
25 1
java基础(11)函数重载以及函数递归求和
|
17天前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
35 9
|
15天前
|
缓存 负载均衡 Dubbo
Dubbo技术深度解析及其在Java中的实战应用
Dubbo是一款由阿里巴巴开源的高性能、轻量级的Java分布式服务框架,它致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
40 6
|
17天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
25 7
|
15天前
|
开发工具 Android开发 git
Android实战之组件化中如何进行版本控制和依赖管理
本文介绍了 Git Submodules 的功能及其在组件化开发中的应用。Submodules 允许将一个 Git 仓库作为另一个仓库的子目录,有助于保持模块独立、代码重用和版本控制。虽然存在一些缺点,如增加复杂性和初始化时间,但通过最佳实践可以有效利用其优势。
19 3
|
18天前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
43 5
|
18天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
58 1
|
9天前
|
Java 数据中心 微服务
Java高级知识:线程池隔离与信号量隔离的实战应用
在Java并发编程中,线程池隔离与信号量隔离是两种常用的资源隔离技术,它们在提高系统稳定性、防止系统过载方面发挥着重要作用。
7 0
|
13天前
|
消息中间件 缓存 Java
RocketMQ的JAVA落地实战
RocketMQ作为一款高性能、高可靠、高实时、分布式特点的消息中间件,其核心作用主要体现在异步处理、削峰填谷以及系统解耦三个方面。
56 0
下一篇
无影云桌面