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

目录
相关文章
|
4天前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
20天前
|
安全 Kotlin
Kotlin教程笔记(23) -作用域函数
Kotlin教程笔记(23) -作用域函数
54 6
|
20天前
|
Kotlin
Kotlin教程笔记(21) -高阶函数与函数引用
Kotlin教程笔记(21) -高阶函数与函数引用
30 6
|
1月前
|
Kotlin
Kotlin - 高阶函数与函数引用
Kotlin - 高阶函数与函数引用
29 3
Kotlin - 高阶函数与函数引用
|
20天前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
22 1
|
1月前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
42 13
|
24天前
|
IDE 开发工具 Kotlin
Kotlin教程笔记(6) - 函数与Lambda表达式
Kotlin教程笔记(6) - 函数与Lambda表达式
48 1
|
1月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
52 6
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
IDE 开发工具 Kotlin
Kotlin - 函数与Lambda表达式
Kotlin - 函数与Lambda表达式
25 1