如何在Kotlin中初始化一个线程?

时间:2017-09-30 17:57:03

标签: java multithreading kotlin

在Java中,它通过接受一个实现runnable的对象来工作:

Thread myThread = new Thread(new myRunnable())

其中myRunnable是实现Runnable的类。

但是当我在Kotlin尝试这个时,它似乎不起作用:

var myThread:Thread = myRunnable:Runnable

9 个答案:

答案 0 :(得分:19)

对于初始化Thread的对象,您只需调用构造函数:

val t = Thread()

然后,您还可以传递一个带有lambda(SAM转换)的可选Runnable,如下所示:

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的默认值。

答案 1 :(得分:5)

可运行:

val myRunnable = runnable {

}

主题:

Thread({  
// call runnable here
  println("running from lambda: ${Thread.currentThread()}")
}).start()

你在这里看不到Runnable:在Kotlin中,它可以很容易地用lambda表达式替换。有没有更好的办法?当然!以下是如何实例化和启动a 线程Kotlin风格:

thread(start = true) {  
      println("running from thread(): ${Thread.currentThread()}")
    }

答案 2 :(得分:2)

我做了以下操作,它似乎按预期运行。

Thread(Runnable {
            //some method here
        }).start()

答案 3 :(得分:0)

请尝试以下代码:

Thread().run { Thread.sleep(3000); }

答案 4 :(得分:0)

最好的方法是使用thread()中的kotlin.concurrent生成器函数: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html

您应该检查其默认值,因为它们非常有用:

thread() { /* do something */ }

请注意,您不需要像线程示例中那样致电start(),或提供start=true

小心运行很长一段时间的线程。指定thread(isDaemon= true)非常有用,这样您的应用程序就能够正确终止。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

ThreadLamda的基本示例

fun main() {
    val mylamda = Thread({
        for (x in 0..10){
            Thread.sleep(200)
            println("$x")
        }
   })
    startThread(mylamda)

}

fun startThread(mylamda: Thread) {
    mylamda.start()
}

答案 7 :(得分:0)

thread { /* your code here */ }

答案 8 :(得分:0)

首先,创建一个用于设置默认属性的函数

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...")
}