Study/Android

안드로이드 스레드에 대한 공부 (작성중)

USAGI_ 2023. 2. 14. 23:59

https://developer.android.com/guide/components/processes-and-threads?hl=ko 

 

프로세스 및 스레드 개요  |  Android 개발자  |  Android Developers

프로세스 및 스레드 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 애플리케이션 구성 요소가 시작되고 애플리케이션에 실행 중인 다른 구성 요소가

developer.android.com

4주차 과제인 멀티 스레드에 대해 공부해보기로 했다. 

 

- Thread  

스레드는 뭘까? 무언가의 흐름 ?  

스레드는 동시에 여러작업을 수행하기 위해 사용된다. 

메서드의 경우, 하나의 작업이 모두 끝나면 다음 작업이 진행되지만 스레드는 하나의 작업이 끝나기 전에 다른 작업을 동시에 진행할 수 있다. 

class MainActivity : AppCompatActivity() {
    val TAG: String = "로그"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Thread() {

        }.start()
            for(i in 0 until 100){
                Log.d(TAG, "Thread 1 :$i")

            }
        Thread() {
            for(i in 100 downTo 0) {
                Log.d(TAG, "Thread 2 :$i")

            }
        }.start()
    }
}

스레드를 확인하기 위한 예제. 스레드 2개를 생성하였다.

스레드1이 1~100까지 반복문을 돈 후, 스레드2가 시작되는 것을 확인할 수 있다.

class MainActivity : AppCompatActivity() {
    val TAG: String = "로그"
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var handler = Handler(Looper.getMainLooper())

        Thread() {
            for(i in 0 until 100){
                    Log.d(TAG, "Thread 1 :$i")
            }
        }.start()

        Thread() {
            for(i in 100 downTo 0) {
                    Log.d(TAG, "Thread 2 :$i")
            }
        }.start()

    }
}

다음은 스레드를 동시에 실행시켜보았다. 

스레드1이 끝나기도 전에 스레드2가 실행되며 동시에 실행되고 있는 것을 확인할 수 있다.

 

싱글 스레드 멀티 스레드가 무조건 좋은 것은 아니다.

가벼운 작업은 멀티스레드를 사용하면 낭비가 될 수 있지만 무거운 작업은 멀티 스레드가 유용할 것이다. 

 

예시로 든다면 싱글스레드는 턴제 게임 ( 고스톱, 포커 등 카드게임 )

멀티스레드는 서로의 행동에 영향을 받지않는 RPG 게임과 유사하다 볼 수 있을 것 같다. 

출처 https://medium.com/@ankit.sinhal/handler-in-android-d138c1f4980e

- Handler ? 

다른 객체들이 보낸 데이터를 받고 처리하는 객체이다.

스레드에서 UI를 제어하려고 할 땐 핸들러가 사용되며, 핸들러를 사용하면

원래 스레드가 아닌 다른 스레드에서도 뷰를 다룰 수 있다!