[kotlin] 코틀린 스크립트에서의 스레드 처리 방법

코틀린은 강력한 스레드 처리 기능을 제공하여 다중 스레드 환경에서 효율적으로 작업을 처리할 수 있도록 도와줍니다. 이번 글에서는 코틀린 스크립트에서의 스레드 처리 방법을 살펴보겠습니다.

1. 스레드 생성과 실행

코틀린에서는 Thread 클래스를 사용하여 스레드를 생성하고, start() 메서드를 통해 스레드를 실행시킬 수 있습니다. 아래는 스레드를 생성하고 실행하는 예제입니다.

import kotlin.concurrent.thread

fun main() {
    thread {
        // 스레드에서 실행할 작업
        println("스레드에서 실행되는 작업")
    }

    // 메인 스레드에서 실행되는 작업
    println("메인 스레드에서 실행되는 작업")
}

실행 결과는 다음과 같습니다.

메인 스레드에서 실행되는 작업
스레드에서 실행되는 작업

2. 스레드 간 통신

코틀린에서는 Thread 클래스 뿐만 아니라 Coroutine을 사용하여 스레드 간 통신을 할 수도 있습니다. Coroutine은 비동기 작업을 효율적으로 처리하기 위한 라이브러리로, 코틀린에서 제공하는 suspend 함수와 함께 사용됩니다.

아래는 Coroutine을 사용하여 스레드 간에 값을 주고받는 예제입니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val result = GlobalScope.async {
        delay(1000)
        "Hello, World!"
    }

    println("작업 진행 중...")

    val message = result.await()
    println("결과: $message")
}

실행 결과는 다음과 같습니다.

작업 진행 중...
결과: Hello, World!

3. 스레드 안전성 보장

다중 스레드 환경에서는 스레드 안전성을 보장하는 것이 중요합니다. 코틀린에서는 Thread 클래스를 사용할 때 synchronized 키워드를 사용하여 공유 자원에 대한 접근을 동기화할 수 있습니다.

아래는 synchronized를 사용하여 스레드 안전성을 보장하는 예제입니다.

class Counter {
    private var count = 0

    @Synchronized
    fun increment() {
        count++
    }

    @Synchronized
    fun decrement() {
        count--
    }

    fun getCount(): Int {
        return count
    }
}

fun main() {
    val counter = Counter()

    thread {
        for (i in 1..1000) {
            counter.increment()
        }
    }

    thread {
        for (i in 1..1000) {
            counter.decrement()
        }
    }

    thread {
        println("카운트: ${counter.getCount()}")
    }
}

실행 결과는 다음과 같습니다.

카운트: 0

마치며

위에서 살펴본 것처럼, 코틀린 스크립트에서도 다양한 스레드 처리 방법을 활용할 수 있습니다. 문제에 맞는 적절한 스레드 처리 방법을 선택하여 다중 스레드 환경에서 안정적인 작업을 수행할 수 있도록 하세요.