[kotlin] 코틀린에서의 스레드 간 메시지 전달

코틀린은 자바와 마찬가지로 멀티스레드 환경에서 작업을 수행할 수 있습니다. 이러한 멀티스레드 환경에서 스레드 간 메시지를 전달하는 것은 중요한 부분입니다. 이번 포스트에서는 코틀린에서 스레드 간 메시지를 전달하는 방법에 대해 알아보겠습니다.

##1. 스레드 간 메시지 전달을 위한 공유 변수 사용 가장 기본적인 방법은 공유 변수를 사용하여 스레드 간에 메시지를 전달하는 것입니다. 스레드는 공유 변수를 읽고 쓰는 방식으로 메시지를 전달할 수 있습니다. 이를테면, 다음과 같은 예제 코드를 살펴봅시다.

var message: String? = null

val thread1 = thread(start = true) {
    message = "Hello from Thread 1"
}

val thread2 = thread(start = true) {
    println("Thread 2 receives message: $message")
}

위의 예제에서는 message라는 공유 변수를 사용하여 스레드 간에 메시지를 전달합니다. thread1message 변수에 “Hello from Thread 1”이라는 메시지를 저장하고, thread2message 변수를 읽어와서 그 값을 출력합니다.

하지만 이러한 방식은 공유 변수를 사용하기 때문에 값의 일관성과 동기화에 주의해야 합니다.

##2. Handler를 사용한 스레드 간 메시지 전달

코틀린에서는 안드로이드 앱 개발에 사용되는 Handler 클래스를 사용하여 스레드 간에 메시지를 전달할 수도 있습니다. Handler는 메시지 큐에 메시지를 보내고 다른 스레드에서 이를 받아 처리하는 역할을 합니다.

다음은 Handler를 사용한 예제 코드입니다.

val handler = Handler(Looper.getMainLooper())

val thread1 = thread(start = true) {
    val message = Message.obtain()
    message.obj = "Hello from Thread 1"
    handler.sendMessage(message)
}

val handlerCallback = Handler.Callback { message ->
    val receivedMessage = message.obj.toString()
    println("Thread 2 receives message: $receivedMessage")
    true
}

val handler2 = Handler(Looper.getMainLooper(), handlerCallback)

위의 예제에서는 handler를 사용하여 메시지를 전달하는 작업을 수행합니다. thread1message 객체를 생성하고 내용을 설정한 후, handler를 통해 메시지를 보냅니다. 이후, handlerCallback을 사용하여 메시지를 받아 처리하는 작업을 수행합니다.

Handler를 사용하면 스레드 간 메시지 전달이 간편해지며, 동기화 문제에 대한 처리도 일부분 해결됩니다.

##3. 코루틴을 사용한 스레드 간 메시지 전달

마지막으로, 코틀린에서는 코루틴을 사용하여 스레드 간 메시지를 전달할 수 있습니다. 코루틴은 비동기 작업을 쉽게 다룰 수 있도록 도와주는 기능입니다.

다음은 코루틴을 사용한 예제 코드입니다.

val thread1 = thread(start = true) {
    runBlocking {
        val message = "Hello from Thread 1"
        withContext(Dispatchers.Main) {
            println("Thread 2 receives message: $message")
        }
    }
}

위의 예제에서는 runBlocking을 사용하여 비동기 작업을 수행합니다. withContext를 사용하여 메시지를 출력하는 작업을 Main 스레드로 전환합니다.

코루틴을 사용하면 스레드 간 메시지 전달이 더욱 간편하고 가독성이 좋아지며, 동기화 문제를 쉽게 처리할 수 있습니다.

사실, 코틀린에서는 여러 가지 다양한 방법으로 스레드 간 메시지를 전달할 수 있습니다. 이번 포스트에서는 가장 기본적인 방법부터 코루틴까지 다루었습니다. 실제 개발 시에는 상황에 따라 가장 적합한 방법을 선택하여 사용하면 됩니다.

참고 자료: