在Java中,它通过接受实现了Runnable接口的对象来工作:
Thread myThread = new Thread(new myRunnable())
其中myRunnable
是一个实现了Runnable
接口的类。
但是当我在Kotlin中尝试这样做时似乎不起作用:
var myThread:Thread = myRunnable:Runnable
在Java中,它通过接受实现了Runnable接口的对象来工作:
Thread myThread = new Thread(new myRunnable())
其中myRunnable
是一个实现了Runnable
接口的类。
但是当我在Kotlin中尝试这样做时似乎不起作用:
var myThread:Thread = myRunnable:Runnable
Kotlin自带一个标准库函数thread
,我建议在此处使用:
public fun thread(
start: Boolean = true,
isDaemon: Boolean = false,
contextClassLoader: ClassLoader? = null,
name: String? = null,
priority: Int = -1,
block: () -> Unit): Thread
thread {
Thread.sleep(1000)
println("test")
}
它有许多可选参数,例如通过将start
设置为false
来不直接启动线程。
替代方案
要初始化类Thread
的实例,请调用其构造函数:
val t = Thread()
Runnable
作为lambda(SAM转换)传递,如下所示:Thread {
Thread.sleep(1000)
println("test")
}
Runnable
实现:Thread(Runnable {
Thread.sleep(1000)
println("test")
})
Thread
实例,并没有真正地启动它。为了达到这个目的,您需要显式地调用start()
方法。start=true
(因为默认情况下 start
为 true
),并且只需编写 thread { Thread.sleep(1000) }
即可启动线程。 - Ilya Serbis可运行的:
val myRunnable = runnable {
}
线程:
Thread({
// call runnable here
println("running from lambda: ${Thread.currentThread()}")
}).start()
在这里你看不到 Runnable:在 Kotlin 中,它可以很容易地用 lambda 表达式替换。有更好的方式吗?当然有!以下是您可以通过 Kotlin 方式实例化和启动线程的方法:
thread(start = true) {
println("running from thread(): ${Thread.currentThread()}")
}
我按照以下方式操作,看起来效果符合预期。
Thread(Runnable {
//some method here
}).start()
最好的方法是使用kotlin.concurrent
中的thread()
生成器函数:
你应该检查它的默认值,因为它们非常有用:
thread() { /* do something */ }
start()
或提供start=true
。thread(isDaemon=true)
很有用,以便您的应用程序能够正确终止。首先,创建一个用于设置默认属性的函数
fun thread(
start: Boolean = true,
isDaemon: Boolean = false,
contextClassLoader: ClassLoader? = null,
name: String? = null,
priority: Int = -1,
block: () -> Unit
): Thread
然后执行调用此函数的后台操作
thread(start = true) {
//Do background tasks...
}
或者Kotlin协程也可以用于执行后台任务。
GlobalScope.launch {
//TODO("do background task...")
withContext(Dispatchers.Main) {
// TODO("Update UI")
}
//TODO("do background task...")
}
Thread
与Lamda
的基本示例
fun main() {
val mylamda = Thread({
for (x in 0..10){
Thread.sleep(200)
println("$x")
}
})
startThread(mylamda)
}
fun startThread(mylamda: Thread) {
mylamda.start()
}
thread { /* your code here */ }
Thread().run { Thread.sleep(3000); }
Thread.sleep(3000)
(使用 Kotlin 的通用 run
扩展方法,将新创建的线程作为接收器但未执行任何操作)。 - Ilya Serbisfun main(args: Array<String>) {
Thread({
println("test1")
Thread.sleep(1000)
}).start()
val thread = object: Thread(){
override fun run(){
println("test2")
Thread.sleep(2000)
}
}
thread.start()
Thread.sleep(5000)
}
Thread {
// your code here
}.start()
另一个例子:
val thr = Thread {
// your code here
}
thr.start()
thr.join()
var myThread = Thread(myRunnable())
- MibacmyThread:Thread
表示变量myThread
的类型是Thread
。而执行myRunnable:Runnable
没有任何意义。在 Kotlin 中初始化类与 Java 非常相似,只需删除new
关键字即可。相关的 Kotlin 文档:a,b。 - Mibacx = Y:y
时,Y:y
这部分没有任何意义。 - Mibac