介绍
本篇主要介绍Kotlin
中的线程,注意不是协程而是线程。Kotlin
本身是支持线程的。同时协程也是运行在线程中的。
Kotlin
程序至少会有一个线程,而这个线程也就是我们常说的主线程。
程序启动后由Java
虚拟机创建主线程,程序结束后由java
虚拟机销毁主线程。
而我们开发人员创建的各种线程都是子线程。主线程负责管理子线程的启动,挂起,停止等操作。
而主线程,在我们应用开发中还有一个名称:UI
线程。
1. 创建线程
在java
中线程类是Thread
,Kotlin
中的线程也是使用了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处于空闲状态也不能执行该线程。阻塞有以下几种原因:- 当线程调用
sleep()
,进入休眠状态。 - 其他线程调用了
join()
,等待其他线程结束时。 - 发出
I/O
请求,处于等待I/O
操作阶段。 - 当前线程调用了
wait()
函数,进入阻塞状态。
- 当线程调用
- 死亡状态
Dead
:线程执行完毕后的最终阶段,就是进入到死亡状态。两种情况下会进入到死亡状态:线程体内容执行完毕,线程执行过程中出现异常。当线程进入死亡状态,我们不能再进行操作。系统将会回收相关资源并销毁。
整个生命周期的效果图如下:
线程的基本情况就是这样了。
评论区