2017-09-30 114 views
4

在Java它的工作原理通过接受其实现可运行的对象:如何初始化Kotlin中的线程?

Thread myThread = new Thread(new myRunnable()) 

其中myRunnable是实施Runnable一个类。

但当我这个在科特林,它不似乎工作:

var myThread:Thread = myRunnable:Runnable 
+0

'var myThread = Thread(myRunnable())' – Mibac

+0

@Mibac It Worked !!你能帮我理解这段代码吗? –

+0

做'myThread:Thread'说变量'myThread'的类型是'Thread'。做'myRunnable:Runnable'没有任何意义。在Kotlin中初始化类与Java非常相似。你只需删除'new'关键字。相关的Kotlin文档:[a](https://kotlinlang.org/docs/reference/classes.html#creating-instances-of-classes),[b](https://kotlinlang.org/docs/reference/basic -syntax.html #definition-local-variables) – Mibac

回答

0

的Runnable:

val myRunnable = runnable { 

} 

主题:

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

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

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

@Mibac我提供了更多的选择 –

4

用于初始化的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 { 

//usage 

thread(start = true) { 
    Thread.sleep(1000) 
    println("test") 
} 

它有许多例如可选参数如此处所示直接启动线程。

+0

,所以线程在println后被杀死? – 2ndGAB

0

请试试这个代码:

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

也尝试添加一些解释 –

+0

虽然这可能会回答这个问题,但最好解释答案的基本部分,以及OPs代码可能存在的问题。 – pirho

0

最好的办法是使用thread()发生器功能从kotlin.concurrenthttps://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html

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

thread() { /* do something */ } 

请注意,您不需要拨打start()就好像在Thre广告示例,或提供start=true

请注意长时间运行的线程。指定thread(isDaemon= true)以便您的应用程序能够正确终止很有用。