【问题标题】:How to initialize a Thread in Kotlin?如何在 Kotlin 中初始化一个线程?
【发布时间】:2018-03-12 08:16:41
【问题描述】:

在 Java 中,它通过接受实现可运行的对象来工作:

Thread myThread = new Thread(new myRunnable())

其中myRunnable 是一个实现Runnable 的类。

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

var myThread:Thread = myRunnable:Runnable

【问题讨论】:

  • var myThread = Thread(myRunnable())
  • @Mibac 成功了!!你能帮我理解这段代码吗?
  • 执行myThread:Thread 表示变量myThread 的类型为Thread。并且做myRunnable:Runnable 没有任何意义。在 Kotlin 中初始化类与 Java 非常相似。您只需删除 new 关键字。相关 Kotlin 文档:ab
  • 谢谢。所以 x:X 格式适用于类但不适用于接口?
  • 它确实适用于接口,但是当您使用x = Y:y 时,Y:y 部分毫无意义。

标签: java multithreading kotlin


【解决方案1】:

可运行:

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

【讨论】:

  • @Mibac 我提供了更多选择
【解决方案2】:

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) }即可开始线程。
  • 我已经添加了一个注释以使其更明显,谢谢
【解决方案3】:

请试试这个代码:

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

【讨论】:

  • 也尝试添加一些解释
  • 虽然这可能会回答这个问题,但最好解释一下答案的基本部分,以及 OP 代码可能存在什么问题。
  • 这段代码没有解决问题:它没有启动新线程,而是在当前线程中执行Thread.sleep(3000)(使用Kotlin的通用run extension method,它得到了新的创建线程作为接收器,但不对其执行任何操作)。
【解决方案4】:

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

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

thread() { /* do something */ }

请注意,您无需像 Thread 示例中那样调用 start(),或提供 start=true

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

通常应用程序会等到所有非守护线程终止。

【讨论】:

  • 不错且简单的解决方案... isDaemon 是做什么的?请在你的回答中解释一下。
【解决方案5】:

我执行了以下操作,它似乎按预期工作。

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

【讨论】:

    【解决方案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】:

    ThreadLamda 的基本示例

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

    【讨论】:

      【解决方案8】:
      thread { /* your code here */ }
      

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 2021-04-24
          • 2016-08-22
          • 1970-01-01
          • 2021-07-02
          • 2020-04-26
          • 1970-01-01
          相关资源
          最近更新 更多