📅  最后修改于: 2023-12-03 15:08:13.073000             🧑  作者: Mango
在 Kotlin 中,创建线程可以使用标准库提供的 Thread
类。但是在实际开发中,我们更加推荐使用 kotlinx.coroutines
库提供的协程来处理异步任务。
可以通过创建一个 Thread
对象并传入可调用对象来创建线程。可调用对象可以是一个函数、一个 Lambda 表达式或者一个对象。
// 创建一个新线程,传入一个 Runnable 对象
Thread(Runnable {
// 线程执行的代码
}).start()
// 创建一个新线程,传入一个 Lambda 函数
Thread {
// 线程执行的代码
}.start()
// 创建一个新线程,传入一个对象的方法
class Example {
fun doSomething() {
// 线程执行的代码
}
}
Thread(Example()::doSomething).start()
可以通过调用 Thread.interrupt()
方法来销毁线程。此方法将为线程设置中断标志,以便在稍后的时间内停止执行中的代码。
// 创建一个新线程
val thread = Thread {
while (!Thread.currentThread().isInterrupted) {
// 线程执行的代码
}
}
// 启动线程
thread.start()
// 销毁线程
thread.interrupt()
在 build.gradle
文件中添加以下依赖:
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:x.y.z"
}
其中 x.y.z
是当前 kotlinx.coroutines
版本号。
通过 launch
函数创建协程,传入一个可调用对象来执行异步任务。可调用对象可以是一个函数、一个 Lambda 表达式或者一个对象的方法。
// 创建一个协程
GlobalScope.launch {
// 协程执行的代码
}
// 使用 async 函数创建协程,并返回一个 Deferred 对象,可用于获取异步任务的结果
val deferredResult = GlobalScope.async {
// 协程执行的代码
}
协程可以使用 cancel
方法来取消,也可以使用协程作用域的 cancel
方法来取消一组协程。
val job = GlobalScope.launch {
while (isActive) {
// 协程执行的代码
}
}
job.cancel() // 取消单一协程
val job1 = GlobalScope.launch {
// 协程 1 执行的代码
}
val job2 = GlobalScope.launch {
// 协程 2 执行的代码
}
coroutineScope {
job1 // 添加到作用域
job2 // 添加到作用域
cancel() // 取消所有协程
}
使用标准库创建线程需要手动管理线程的生命周期和资源,容易出现线程安全问题。而使用 kotlinx.coroutines
库处理异步任务可以让代码更简洁,可读性更高,并且可以自动管理协程的生命周期和资源,避免了线程安全问题。