一、开启线程方式
1.1 使用 object
object : Thread() {
override fun run() {
println("使用object")
}
}.start()
1.2 使用 Lambda
Thread {
println("使用lambda")
}.start()
1.3 使用函数
//start:是否立即执行。传参false的话,用返回值手动调用start()
//isDaemon:是否是守护线程,当运行的全是守护线程JVM退出
//contextClassLoader:类加载器,用来加载这个线程的类和资源
thread(start = true, isDaemon = false, contextClassLoader = null, name = "t2", priority = 3) {
Thread.sleep(1000)
println("使用函数")
}.start()
1.4 继承 Thread
class T4 : Thread() {
override fun run() {
println("继承Thread类")
}
}
1.5 实现 Runnable
class T5 : Runnable {
override fun run() {
println("实现Runnable接口")
}
}
二、同步
2.1 @synchronized
@Synchronized //和Java中的synchronized关键字相同。
fun method() { }
2.3 synchronized( )
//为了同步多个并行任务的结果则需要声明n个锁,即需嵌套n个synchronized。
fun method() {
val lock = "hello"
Thread {
synchronized(lock) {}
synchronized(Unit) {}
}.start()
}
2.4 join( )
lateinit var str1: String
lateinit var str2: String
fun method() {
val t1 = thread(start = true) { str1 = "AAA" }
val t2 = thread(start = true) { str2 = "BBB" }
t1.join()
t2.join()
show(str1, str2)
}
fun show(str1: String, str2: String) = println("${str1}、${str2}")
2.5 ReentrantLock( )
val lock = ReentrantLock()
Thread {
lock.lock() //上锁
s1 = task1() //耗时操作
lock.unlock() //解锁
}.start()
2.6 @volatile
@Volatile //和Java中的Volatile关键字相同。
private var tag = false
fun start() {
tag = true
thread(start = true) {
var count = 0
while (tag) {
Thread.sleep(100)
count++
println(count)
}
}
}
fun stop() {
tag = false
}
fun main() {
thread(start = true) {
start()
Thread.sleep(1000)
stop()
}
}