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查看更多精彩文章!

目录
相关文章
|
2月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
247 119
|
3月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
340 0
|
3月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
441 100
|
2月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
259 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
223 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
556 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
2月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
136 0
|
3月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
1048 8
|
3月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
484 12
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。

热门文章

最新文章