Thread : 프로세스 내부에서 일을 하는 주체, 실, 흐름
worker thread에서 view 렌더링을 하고싶다면 ⇒ main thread에 요청해야함
스레드를 사용하는 경우 : main thread에서 실행시키기엔 너무 오래걸리는 = 계속 작동하는
Looper
Looper의 역활
Looper는 하나의 스레드만 담당할 수 있고, 하나의 스레드도 오직 하나의 Looper만을 가질 수 있습니다.
Looper는 MessageQueue가 비어 있는 동안은 아무 행동도 하지 않고 메세지가 들어오면 해당 메세지를 꺼내 적절한 Handler로 전달합니다.
계속 반복적으로 수행하는 동작 때문에 Looper라는 이름이 지어졌다고 합니다
Handler는 무조건 Looper와 MessageQueue가 필요하므로 어떤 스레드와 연동되기 위해서는 Looper가 꼭 필요하다는 것을 알 수 있습니다.
Thread 종료
Thread.destory()
함수는 Thread를 파괴하기 위해 함수가 만들어졌지만, 이 함수를 구현하면 리소스를 정리하지 못해 데드락
이 발생할 수 있다는 단점이 생겨서 구현이 되어 있지 않음스레드를 외부에서 안전하게 종료시키는 방법은 Thread.interrupt()
를 사용하는 것입니다.
Thread 객체는 interrupt라는 boolean 플래그 변수를 가지고 있고 이 함수를 호출하면 해당 플래그 값을
true
로 설정합니다. 주의할 점은 스레드를 즉시 종료시키는 방법은 아닙니다. interrupt 플래그 값이 true로 설정되고 스레드가 일시 정지상태가 되었을 때 (예를 들면 sleep() 함수를 호출했을 때) InterruptedException
오류를 발생시키게 되어 쓰레드가 종료되게 만들 수 있습니다
Splash Theme : 앱이 로드되는동안 보여주는 화면
코루틴 :
먼저, 둘의 차이점을 말하기 전에 둘의 공통점은 프로그램을 만드는 과정에서 '비동기' 작업을 하기 위해서 사용한다는 점이다.
비동기 작업은 어떤 작업을 수행할 때, 이가 끝나는 것을 기다리지 않고 다른 작업을 수행하는 것이고
반대로 동기 작업은 해당 작업이 끝날 때까지 기다린 뒤 다음 작업을 수행하는 것이다.
그런데, 스레드와 코루틴은 근본적으로 큰 차이가 있다.
스레드의 경우 여러 개의 스레드를 사용해서 여러 개의 작업을 '병렬'로 수행하여 비동기적으로 작동한다.
하지만 코루틴의 경우 비동기 작업에 사용되긴 하지만 실제로는 병렬적으로 수행되는 것이 아니고
여러 개의 작업을 잘게 쪼개서 나눠서 작업을 수행하는 방식이다.
스레드를 설명할 때 일꾼, 생산라인 등에 비유하는 경우가 있는데
위의 경우 스레드는 두 개의 작업을 두 일꾼이 동시에 처리하는 '병렬' 작업이 될 것이고