Как инициализировать поток в Котлине?
В Java он работает, принимая объект, который реализует runnable:
Thread myThread = new Thread(new myRunnable())
где myRunnable
- класс, реализующий Runnable
.
Но когда я попробовал это в Котлине, он не работает:
var myThread:Thread = myRunnable:Runnable
Ответы
Ответ 1
Для инициализации объекта Thread
вы просто вызываете конструктор:
val t = Thread()
Затем вы также можете передать необязательный Runnable
с лямбда-выражением (преобразование SAM) следующим образом:
Thread {
Thread.sleep(1000)
println("test")
}
Более явная версия передает анонимную реализацию Runnable
следующим образом:
Thread(Runnable {
Thread.sleep(1000)
println("test")
})
Обратите внимание, что ранее показанные примеры только создают экземпляр Thread
но фактически не запускают его. Для этого вам нужно явно вызвать start()
.
И последнее, но не менее важное: вам нужно знать стандартный thread
функций библиотеки, который я бы порекомендовал использовать:
public fun thread(start: Boolean = true, isDaemon: Boolean = false, contextClassLoader: ClassLoader? = null, name: String? = null, priority: Int = -1, block: () -> Unit): Thread {
Вы можете использовать это так:
thread(start = true) {
Thread.sleep(1000)
println("test")
}
Он имеет много необязательных параметров, например, для непосредственного запуска потока, как показано здесь. Обратите внимание, что true
в любом случае является значением по умолчанию для start
.
Ответ 2
Runnable:
val myRunnable = runnable {
}
Тема:
Thread({
// call runnable here
println("running from lambda: ${Thread.currentThread()}")
}).start()
Здесь вы не видите Runnable: в Kotlin его можно легко заменить выражением лямбда. Есть ли способ лучше? Конечно! Здесь, как вы можете создать экземпляр и запустить
нить Котлинский стиль:
thread(start = true) {
println("running from thread(): ${Thread.currentThread()}")
}
Ответ 3
Я сделал следующее и, похоже, работает как ожидалось.
Thread(Runnable {
//some method here
}).start()
Ответ 4
Пожалуйста, попробуйте этот код:
Thread().run { Thread.sleep(3000); }
Ответ 5
Лучшим способом было бы использовать функцию генератора thread()
от kotlin.concurrent
:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html
Вы должны проверить свои значения по умолчанию, поскольку они весьма полезны:
thread() { /* do something */ }
Обратите внимание, что вам не нужно вызывать start()
, как в примере Thread, или предоставить start=true
.
Будьте осторожны с потоками, которые работают в течение длительного периода времени. Полезно указать thread(isDaemon= true)
, чтобы ваше приложение могло корректно завершить работу.
Ответ 6
fun 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)
}
Ответ 7
Базовый пример 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()
}