코틀린에서 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
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크