Kotlin - Thread 생성 및 실행

코틀린에서 Thread를 생성하고 실행하는 방법을 소개합니다.

1. Thread 클래스 구현

다음과 같이 Thread를 상속하여 새로운 Thread 클래스를 구현할 수 있습니다. 그리고 run()을 오버라이드하여 처리해야하는 내용을 구현하시면 됩니다.

class MyThread: Thread() {
    public override fun run() {
        println("${Thread.currentThread()}: it's running.")
    }
}

fun main(args: Array<String>) {
    println("${Thread.currentThread()}: run the thread")

    val myThread = MyThread()
    myThread.start()

    println("${Thread.currentThread()}: wait until the thread is done")
    myThread.join()
}

Output:

Thread[main,5,main]: run the thread
Thread[main,5,main]: wait until the thread is done
Thread[Thread-0,5,main]: it's running.

join()은 thread가 종료될 때까지 기다립니다. run()을 호출하지 않으면 Main thread가 종료되며, 새로운 thread가 수행되기 전에 프로그램이 종료될 수 있습니다.

2.1 Runnable 구현

새로운 Thread를 구현하는 대신에, Runnable을 구현하고 Thread에 인자로 전달하여 실행시킬 수 있습니다.

실행해보면, 동작은 이전 코드와 동일합니다.

class MyRunnable: Runnable {
    public override fun run() {
        println("${Thread.currentThread()}: it's running.")
    }
}

fun main(args: Array<String>) {
    println("${Thread.currentThread()}: run the thread")

    val myThread = Thread(MyRunnable())
    myThread.start()

    println("${Thread.currentThread()}: wait until the thread is done")
    myThread.join()
}

Output:

Thread[main,5,main]: run the thread
Thread[main,5,main]: wait until the thread is done
Thread[Thread-0,5,main]: it's running.

2.2 Runnable 구현 (Lambda)

Runnable 클래스를 구현하는 대신에, 아래와 같이 Lambda 표현식으로 간단히 구현부를 전달할 수 있습니다. 코드는 더 짧아졌고, 동작은 이전 코드와 동일합니다.

fun main(args: Array<String>) {
    println("${Thread.currentThread()}: run the thread")

    val myThread = Thread {
        println("${Thread.currentThread()}: it's running.")
    }
    myThread.start()

    println("${Thread.currentThread()}: wait until the thread is done")
    myThread.join()
}

Output:

Thread[main,5,main]: run the thread
Thread[main,5,main]: wait until the thread is done
Thread[Thread-0,5,main]: it's running.

join()을 호출하지 않는다면 아래와 같이, 더 간단하게 thread를 생성하고 어떤 작업을 처리할 수 있습니다.

Thread {
    println("${Thread.currentThread()}: it's running.")
}.start()

3. Kotlin thread() 함수

코틀린은 thread()함수를 제공하며, thread() { ... }는 thread 객체를 리턴합니다.

기본적으로 Thread.start()가 호출된 상태로 리턴되기 때문에, 직접 호출할 필요가 없습니다.

import kotlin.concurrent.thread

fun main(args: Array<String>) {
    println("${Thread.currentThread()}: run the thread")

    val myThread = thread() {
        println("${Thread.currentThread()}: it's running.")
    }

    println("${Thread.currentThread()}: wait until the thread is done")
    myThread.join()
}

Output:

Thread[main,5,main]: run the thread
Thread[main,5,main]: wait until the thread is done
Thread[Thread-0,5,main]: it's running.

start()가 호출되지 않은 thread를 생성하고 리턴받고 싶다면, start = false를 인자로 전달하면 됩니다.

val myThread = thread(start = false) {
    println("${Thread.currentThread()}: it's running.")
}

join()을 호출하지 않는다면 아래와 같이, 더 간단하게 thread를 생성하고 어떤 작업을 처리할 수 있습니다.

thread() {
    println("${Thread.currentThread()}: it's running.")
}

References

Loading script...
codechachaCopyright ©2019 codechacha