How to initialize a Thread in Kotlin?

JavaMultithreadingKotlin

Java Problem Overview


In Java it works by accepting an object which implements runnable :

Thread myThread = new Thread(new myRunnable())

where myRunnable is a class implementing Runnable.

But when I tried this in Kotlin, it doesn't seems to work:

var myThread:Thread = myRunnable:Runnable

Java Solutions


Solution 1 - Java

Kotlin comes with a standard library function thread, which I'd recommend to use here:

public fun thread(
    start: Boolean = true, 
    isDaemon: Boolean = false, 
    contextClassLoader: ClassLoader? = null, 
    name: String? = null, 
    priority: Int = -1, 
    block: () -> Unit): Thread

You can use it like this:

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

It has many optional parameters for e.g. not starting the thread directly by setting start to false.


Alternatives

To initialize an instance of class Thread, invoke its constructor:

val t = Thread()

You may also pass an optional Runnable as a lambda (SAM Conversion) as follows:

Thread {
    Thread.sleep(1000)
    println("test")
}

The more explicit version would be passing an anonymous implementation of Runnable like this:

Thread(Runnable {
    Thread.sleep(1000)
    println("test")
})

Note that the previously shown examples do only create an instance of a Thread but don't actually start it. In order to achieve that, you need to invoke start() explicitly.

Solution 2 - Java

Runnable:

val myRunnable = runnable {

}

Thread:

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

You don't see a Runnable here: in Kotlin it can easily be replaced with a lambda expression. Is there a better way? Sure! Here's how you can instantiate and start a thread Kotlin-style:

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

Solution 3 - Java

I did the following and it appears to be working as expected.

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

Solution 4 - Java

Best way would be to use thread() generator function from kotlin.concurrent: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html

You should check its default values, as they're quite useful:

thread() { /* do something */ }

Note that you don't need to call start() like in the Thread example, or provide start=true.

Be careful with threads that run for a long period of time. It's useful to specify thread(isDaemon= true) so your application would be able to terminate correctly.

Usually application will wait until all non-daemon threads terminate.

Solution 5 - Java

Firstly, create a function for set default propery

fun thread(
  start: Boolean = true, 
  isDaemon: Boolean = false, 
  contextClassLoader: ClassLoader? = null, 
  name: String? = null, 
  priority: Int = -1, 
  block: () -> Unit
): Thread

then perform background operation calling this function

thread(start = true) {
     //Do background tasks...
}

Or kotlin coroutines also can be used to perform background task

GlobalScope.launch {
 
    //TODO("do background task...")
    withContext(Dispatchers.Main) {
        // TODO("Update UI")
    }
    //TODO("do background task...")
}

Solution 6 - Java

Basic example of Thread with Lamda

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

}

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

Solution 7 - Java

thread { /* your code here */ }

Solution 8 - Java

Please try this code:

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

Solution 9 - Java

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionShubhranshu JainView Question on Stackoverflow
Solution 1 - Javas1m0nw1View Answer on Stackoverflow
Solution 2 - JavaRajesh DalsaniyaView Answer on Stackoverflow
Solution 3 - JavaAdam HurwitzView Answer on Stackoverflow
Solution 4 - JavaAlexey SoshinView Answer on Stackoverflow
Solution 5 - Javaburak isikView Answer on Stackoverflow
Solution 6 - JavaGeet ThakurView Answer on Stackoverflow
Solution 7 - JavaDavid CallananView Answer on Stackoverflow
Solution 8 - JavaHardeep singhView Answer on Stackoverflow
Solution 9 - JavageekowlView Answer on Stackoverflow