Android

[코트린 Coroutine - 1] 스레드 Thread

연나연 2024. 1. 26. 10:43

 

Coroutine 실습은 다음 글에서 하겠습니다 (Coroutine -2)
이번 글에서는 Thread를 위주로 작성합니다 !

1. Android

안드로이드는 리스너의 집합이다
사용자가 버튼을 언제 누를지 모르기에 리스너를 사용힘.
사용자가 버튼을 눌렀을 때 리스너가 작동하도록 하는 원리임! 
리스너 - 사건이 발생했다(사용자에 의한 OR 안드로이드 os에 의한) 는 메시지가 들어오면 동작하는 애

 

2. Coroutine

- Kotlin만 사용가능

클라이언트와 서버간의 네트워크 통신으로 서로 데이터를 주고 받고 하는 것
리스너안에 리스너안에 리스너안에 리스너안에 리스너...... <- 괄호가 몇개인가....
이를 해결하기 위해
작업1 통신대기하다가 끝나면 작업2 대기 통신하고 끝나면 작업3 대기 이런식으로의 방식을 사용하는 것

 

3. Thread 

▼ Thread 사용하는 경우 - 예시
fun main(){

    var a1 = 0
    while(a1<10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }

    var a2 = 0
    while (a2<10){
        Thread.sleep(100)
        println("a2 :$a2")
        a2++
    }

}​

위의 코드는 다음과 같이 실행된다.
근데 이때, while문 두 개를 동시에 동작하도록 하고 싶다면 ???
이럴 경우에 Thread를 사용한다 !!

 

▼ Thread를 사용해보자 !
 -while문 두 개가 동시 실행되도록 코드를 작성해보자 !

       <방법1> <방법2> <방법3> 

        (바쁘신 분들은 <방법3> 으로 바로 가시면 될 것 같네용)

 

미리 말하자면 코드는 항상 위에서 아래로 흘러가는데 하나의 Thread안에서 위에서 아래로 돌아가는 것이다 !

<방법1>
Thread 상속 이용

- Thread 클래스를 상속받은 클래스를 만들어준다.

fun main(){

    // Thread를 가동한다.
    val t1 = ThreadClass()
    t1.start()

    var a1 = 0
    while(a1<10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}


class ThreadClass : Thread(){
    // 별도의 쓰레드를 발생시켜 처리할 코드가 있는 메서드
    override fun run() {
        var a2 = 0
        while (a2<10){
            Thread.sleep(100)
            println("a2 :$a2")
            a2++
        }
    }
}​
위와 같이 각각의 while문 a1, a2가 같이 실행됨을 볼 수 있다. 

 

<방법2>
interface를 이용한 Thread이용 

- interface에는 startMethod가 없으니까 객체를 만든 후, startMethod있는 Thread함수에 담아서 사용

import kotlin.concurrent.thread

fun main(){

    // Thread를 가동한다.
    val r2 = RunnableClass() 
    val t2 = Thread(r2)  
    t2.start()

    var a1 = 0
    while(a1<10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}

// Runnable 인터페이스를 구현한 클래스
class RunnableClass : Runnable{
    // 별도의 쓰래드를 발생시켜 처리할 코드가 있는 메서드
    override fun run() {
        var a3 = 0
        while(a3 < 10){
            Thread.sleep(100)
            println("a3 : $a3")
            a3++
        }
    }
}​

다음과 같이 결과가 출력된다.
<방법3>
Thread 코드 블럭 사용

-코드 블럭 내의 작성한 코드를 별도의 쓰레드로 가동시켜준다
import kotlin.concurrent.thread

fun main(){

    thread {
        var a4 = 0
        while (a4 < 10){
            Thread.sleep(100)
            println("a4 : $a4")
            a4++
        }
    }


    var a1 = 0
    while(a1<10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}​

가장 간단하고 많이 쓰는 방법인 것 같다 .ㅎㅎ
위의 결과들과 똑같이 두 개 while문이 thread를 통해 동시에 실행됨을 볼 수 있다.