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

news2024/11/14 19:54:54

本文首发于公众号“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查看更多精彩文章!

AntDream

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

饭馆扫码点餐小程序什么方法进行开发

扫码点餐模式出现的时间已经比较久,其主要作用便是节约客商时间,客户自己点餐,商家响应餐品跟进,降低服务员长时间沟通成本,当然客户饭馆消费也不能只依靠工具,还是需要与服务结合,打造有温度的…

企业网络安全“九九八十一难”,且看XDR的黑!神!话!

近期,游戏《黑神话悟空》的热度攀升,不仅汇聚了全球玩家的目光,也悄然成为黑客及网络不法分子的目标。 游戏预热阶段,其剧情视频意外泄露,迅速在网络上引发热烈讨论与业内关注。随后,有黑客组织公开宣称将…

Tongweb8074+7049m4 安装TongFlowControl(by lqw)

文章目录 介绍安裝包和説明Tongweb8074 安装TongFlowControlTongweb7049m4 安装TongFlowControl 介绍 TongFlowControl是面向分布式服务架构的流量监控工具,是TongWeb基于QPS/并发数和调用关系的流量 控制功能,可在TongFlowControl控制台进行实时监控和…

pdf2md·技术调研

解析技术调研: 技术项源代码官方说明优/劣势补充1 VikParuchuri/marker (Star 14.9K) https://github.com/VikParuchuri/marker?tabreadme-ov-file 优点: 耗时少精度高(有ocr模型加持)缺点:…

【C++】类与对象篇四

【C】类与对象篇四 一 . 再谈构造函数1 . 构造函数体赋值2. 初始化列表3. explicit关键字 二 . static成员 【面试题】三 . 友元1. 友元函数2. 友元类 四 . 内部类 一 . 再谈构造函数 1 . 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中…

AI 大模型时代,对前端工程师有哪些机遇和挑战?

随着人工智能的发展,AI大模型为人工智能领域带来了巨大的机遇和挑战。前端工程师作为软件开发的重要一环,也需要关注 AI 大模型的发展趋势,并探索如何将其应用于前端开发和优化中。 AI 大模型应用广泛,已经深入到各个行业&#x…

数据结构——队的基本操作

一、顺序队 队的用法:先进先出 跟平时我们遇到的大多情况一样,队的主要思想就是先进先出,比如我去食堂打饭,我先排那么就是我先打到饭咯 顺序队:其实说白了就是一块空间用两个指针去指向,为了实现先进先…

如何获取页面的MP3文件

1、使用Google浏览器, 2、F12打开网页编程模式 3、找到network选项卡, 4、然后点击播放按钮,此时network中会加载各类资源; 5、在type中找到’media‘,点击media的名称; 6、找到request url&#xff1…

【AI绘画教程】StableDiffusion新手教程|5分钟搞定平面线稿转3D效果,100%成功(附教程工具)

大家好,我是画画的小强 曾经,我们对于将线稿转化为精美上色作品只能望而却步,然而如今,有了稳定扩散人工智能AI绘画工具(SD),我们可以以更加神奇的方式为线稿赋予绚丽的色彩,将创意…

Powershell@2 文件操作整理

最近又开始折腾pipeline了,对文件操作,这里实践并记录一下 https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.management/get-content?viewpowershell-7.4 列出文件及文件夹 Get-ChildItem Get-ChildItem -Path D:\1_data…

神经内科经颅磁刺激(TMS)疗法介绍

经颅磁刺激(TMS)作为一种先进的非侵入性、无痛的治疗手段,其核心基于电磁学原理。该技术通过储能电容向特制线圈瞬间释放强大电流,生成穿透颅骨的强磁场。这一磁场在大脑内部诱导产生微弱的感应电流,触发一系列复杂的生…

Pascal编程语言

目录 一、Pascal语言的诞生与特点 二、Pascal编程环境的选择与安装 三、Pascal语法基础与实战 pascal复制代码 pascal复制代码 在计算机编程的丰富世界中,Pascal语言以其严谨的结构和强大的功能而独树一帜。对于初学者来说,Pascal编程语言不仅可以帮…

AI学习记录 - 怎么理解 torch 的 nn.Conv2d

有用就点个赞 怎么理解 nn.Conv2d 参数 conv_layer nn.Conv2d(in_channels3, out_channels 64, kernel_size3, stride1, padding0, biasFalse) in_channels in_channels 可以设置成1,2,3,4等等都可以,一般来说做图像识别的时…

大模型就业行情揭秘:哪些岗位最吃香?

随着人工智能技术的发展,尤其是大模型技术的成熟与广泛应用,相关行业的人才需求量也呈现出爆发式增长。对于想要进入这个领域的求职者来说,了解当前大模型就业岗位的行情显得尤为重要。本文将深入剖析目前大模型就业岗位的市场情况&#xff0…

本地生活本地推软件有哪些?手把手教你从零开始提升转化率!

当前,多家互联网大厂在本地生活版块的布局不断深入,让本地生活市场不断焕发新活力的同时,也使得竞争态势日益激烈。在此背景下,对于本地生活服务商而言,无论是想要拓展品牌商家资源,还是想要改善交付效果&a…

广东超高清视频产业高质量发展成果展在粤开展

8月27日,广东超高清视频产业高质量发展成果展于中国(广州)超高清视频创新产业园区广州国际媒体港举行。本次展会聚焦广东超高清视频产业,展示以新技术赋能广电新质生产力,推动广播影视和网络视听高质量发展的最新成果&…

[Arxiv 2024] Self-Rewarding Language Models

Contents IntroductionMethodExperimentsReferences Introduction 作者提出 Self-Rewarding 训练框架,LLM 在训练过程中同时担任 actor 和 critic,actor 负责合成新数据,critic 负责判断合成数据质量用于组成高质量的偏好数据集用于模型的下…

网络排名变差算法在充电桩计量可信度评价中的应用AcrelCloud-9000安科瑞充电柱收费运营云平台

摘要:网络排名变差算法是指根据充电交易流水数据构造桩车网络,利用复杂网络的投票智慧而非传统的物理实验来获得对量值的信心。将排名变差算法用于桩车网络计算中,旨在检定合格的充电桩对其他充电桩排名变化的影响,这种影响以电动…

若依添加字段权限功能

页面长这样 /*Navicat Premium Data TransferSource Server : 本地Source Server Type : MySQLSource Server Version : 80038Source Host : 127.0.0.1:3306Source Schema : healthTarget Server Type : MySQLTarget Server Version : 80038Fi…

干货满满!五大调光方式让你全面了解LED照明

LED的发光原理同传统照明不同,是靠P-N结发光,同功率的LED光源,因其采用的芯片不同,电流电压参数则不同,故其内部布线结构和电路分布也不同,导致了各生产厂商的光源对调光驱动的要求也不尽相同&a…