侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

Kotlin 线程知识详解

Z同学
2022-03-10 / 0 评论 / 2 点赞 / 770 阅读 / 1,725 字
温馨提示:
本文最后更新于 2022-03-12,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

本篇主要介绍Kotlin中的线程,注意不是协程而是线程。Kotlin本身是支持线程的。同时协程也是运行在线程中的。

Kotlin程序至少会有一个线程,而这个线程也就是我们常说的主线程。

程序启动后由Java虚拟机创建主线程,程序结束后由java虚拟机销毁主线程。

而我们开发人员创建的各种线程都是子线程。主线程负责管理子线程的启动,挂起,停止等操作。

而主线程,在我们应用开发中还有一个名称:UI线程。

image20220310210440686.png

1. 创建线程

java中线程类是ThreadKotlin中的线程也是使用了Java中的Thread类。但是相较于java中的线程创建,Kotlin中创建线程非常简单。直接使用thread()函数就可以了。 thread()函数源码如下所示:

package kotlin.concurrent
public fun thread(
    start: Boolean = true,
    isDaemon: Boolean = false,
    contextClassLoader: ClassLoader? = null,
    name: String? = null,
    priority: Int = -1,
    block: () -> Unit
): Thread

thread()返回类型是Thread类对象。

  • start:在创建完线程后立马启动。设置为true
  • isDaemon:是守护线程。
  • contextClassLoader:是类加载器,用来加载资源等。
  • name:是指定线程名,如果不指定线程名系统会自动分配。
  • priority:设置线程优先级。
  • block:线程体,线程要执行的核心代码块。

下面通过示例了解一下Thread的创建吧。

示例:

import java.lang.Thread.currentThread
import kotlin.concurrent.thread

//创建一个函数
fun zinyanRun() {
    for (i in 1..3) {
        println("第${i}次执行--${currentThread().name}")  //currentThread() 获取当前线程对象
        Thread.sleep(1000)
    }
    println("结束")
}

fun main(arrays: Array<String>) {
    thread { zinyanRun() }
}
//输出
第1次执行--Thread-0
第2次执行--Thread-0
第3次执行--Thread-0
结束

我们上面简单的执行。我们还可以给线程命名。让我们使用一下thread的参数。

示例:

fun main(arrays: Array<String>) {
    thread (name="zinyan"){ zinyanRun() }
}
//输出
第1次执行--zinyan
第2次执行--zinyan
第3次执行--zinyan
结束

2. 线程状态

在线程的生命周期中,一共有五种状态:

  • 新建状态New:通过实例化Thread对象,这个时候它还只是一个空的线程对象。等待主线程的调用
  • 就绪状态Runnable:当主线程调用新建线程并执行start()函数后,线程就进入到了就绪状态Runnable。这个时候线程还没有真正的开始执行它的线程体。这个时候线程处于等待CPU的调度。
  • 运行状态Running:CPU调度处于就绪状态的线程,线程进入到运行状态。处于运行状态的线程独占CPU,并执行线程里面的方法。
  • 阻塞状态Blocked:由于各种原有运行状态下的线程会进入不可运行状态, 该状态就是阻塞。java虚拟机系统不能执行处于阻塞状态的线程,即使CPU处于空闲状态也不能执行该线程。阻塞有以下几种原因:
    1. 当线程调用sleep(),进入休眠状态。
    2. 其他线程调用了join(),等待其他线程结束时。
    3. 发出I/O请求,处于等待I/O操作阶段。
    4. 当前线程调用了wait()函数,进入阻塞状态。
  • 死亡状态Dead:线程执行完毕后的最终阶段,就是进入到死亡状态。两种情况下会进入到死亡状态:线程体内容执行完毕,线程执行过程中出现异常。当线程进入死亡状态,我们不能再进行操作。系统将会回收相关资源并销毁。

整个生命周期的效果图如下:

image20220310214931909.png

线程的基本情况就是这样了。

2

评论区