Android 에서는 앞서 알아 본 것처럼 스레드는 크게 2가지로 나뉜다.
메인 스레드는 하나의 어플에서 단 하나만 존재하고 워크 스레드는 N개가 존재한다.
UI스레드에서는 너무 많은 작업을 하지 않는 것을 안드로이드는 추구한다.
즉, 워크 스레드를 적절히 이용해 메인 스레드에서 무거운 작업을 하지 않고 뷰에 업데이트를 잘 시켜야한다.
스레드를 직접적으로 다루는 가장 최상위 API입니다.
자바에서 Executors와 ExcecutorService를 제공하고 있으며 이를 이용하여 간단하게 스레드 풀을 생성해 병렬 처리를 할 수 있다. (java.util.concurrent.Excutors/ExecutorService)
Executors를 사용할 경우 Excutors가 Factory Method를 제공하기 때문에 개발자가 직접적으로 스레드를 만들필요가 없다.
동시성과 병렬
Concurrent Programming
- 동시성을 목표로 한다
= 같은 종류의 작업을 가능한 많이 동시에 이뤄지는 것을 의미- 개별 클라이언트에 대한 응답은 빠르지 않지만 동시 처리 가능한 클라이언트의 수가 많은 것
Parallel Programming
- 계산의 벙렬성을 목표로 한다
= 어떤 계산을 병렬적으로 수행하여 빠르게 끝낼 수 있는 것- 동시 처리 가능한 요청 클라이언트 수가 많진 않지만 개별 클라이언트에 대한 응답은 빠른 것
위의 그림과 같이 Excutor Service 는 스레드 풀과 Queue로 구성되어 있다. 각각의 task들은 큐에 들어가게 되고 순차적으로 스레드에 할당된다. 스레드가 모두 동작 중이라면 큐에서 대기하게 된다.
스레드를 생성하는 것은 비용이 큰 작업이기에 이를 최소화 하기 위해 미리 스레드 풀안에 스레드를 생성해 놓고 관리하게 된다.
execute()와 submit()으로 task를 등록할 수 있다.
execute()로 task를 등록하고 작업하게 되면 반환값은 void로 반환값 없이 실행만 한다.
submit<반환타입>()로 task를 등록하게 되면 반환 값을 받을 수 있다.