Как инициализировать поток в Котлине?

В 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()
}