[Android] Excecutors

silver·2022년 11월 8일
0

개요

Android 에서는 앞서 알아 본 것처럼 스레드는 크게 2가지로 나뉜다.

  • 메인 스레드
    : UI를 업데이트 할 수 있는 스레드(UI 스레드)
  • 워크 스레드
    : 네트워크 작업 같은 무거운 작업을 하는 스레드

메인 스레드는 하나의 어플에서 단 하나만 존재하고 워크 스레드는 N개가 존재한다.

UI스레드에서는 너무 많은 작업을 하지 않는 것을 안드로이드는 추구한다.
즉, 워크 스레드를 적절히 이용해 메인 스레드에서 무거운 작업을 하지 않고 뷰에 업데이트를 잘 시켜야한다.

Excecutors

스레드를 직접적으로 다루는 가장 최상위 API입니다.
자바에서 Executors와 ExcecutorService를 제공하고 있으며 이를 이용하여 간단하게 스레드 풀을 생성해 병렬 처리를 할 수 있다. (java.util.concurrent.Excutors/ExecutorService)
Executors를 사용할 경우 Excutors가 Factory Method를 제공하기 때문에 개발자가 직접적으로 스레드를 만들필요가 없다.

동시성과 병렬

Concurrent Programming

  • 동시성을 목표로 한다
    = 같은 종류의 작업을 가능한 많이 동시에 이뤄지는 것을 의미
  • 개별 클라이언트에 대한 응답은 빠르지 않지만 동시 처리 가능한 클라이언트의 수가 많은 것

Parallel Programming

  • 계산의 벙렬성을 목표로 한다
    = 어떤 계산을 병렬적으로 수행하여 빠르게 끝낼 수 있는 것
  • 동시 처리 가능한 요청 클라이언트 수가 많진 않지만 개별 클라이언트에 대한 응답은 빠른 것

ExcecutorService 동작 원리


위의 그림과 같이 Excutor Service 는 스레드 풀과 Queue로 구성되어 있다. 각각의 task들은 큐에 들어가게 되고 순차적으로 스레드에 할당된다. 스레드가 모두 동작 중이라면 큐에서 대기하게 된다.
스레드를 생성하는 것은 비용이 큰 작업이기에 이를 최소화 하기 위해 미리 스레드 풀안에 스레드를 생성해 놓고 관리하게 된다.

ExecutorService 객체 생성

  • newFixedThreadPool(int)
    : 입력받은 값만큼 고정된 개수의 스레드를 스레드 풀안에 생성
  • newCachedThreadPool()
    : 필요한 때, 필요한 만큼 스레드 생성
  • newSingleThreadExecutor()
    : 스레드가 1개인 ExecutorService 리턴. 싱글 스레드에서 동잭해야 하는 작업 처리 시 사용

ExecutorService task 등록

execute()와 submit()으로 task를 등록할 수 있다.
execute()로 task를 등록하고 작업하게 되면 반환값은 void로 반환값 없이 실행만 한다.
submit<반환타입>()로 task를 등록하게 되면 반환 값을 받을 수 있다.

ExecutorService 종료

  • shutdown()
    : 스레드 작업이 모두 끝나면 스레드 풀을 종료시킨다.
  • awaitTermination(int, int)
    : 이미 수행 중인 task가 있다면 인자값만큼 기다리게 된다.
  • shutdownNow()
    : 실행중인 모든 task를 강제 종료시킨다.

참고
https://velog.io/@jaeyunn_15/Android-Executors%EC%99%80-%EB%B3%91%EB%A0%AC-%EC%B2%98%EB%A6%AC-%EC%9D%B4%EC%95%BC%EA%B8%B0

0개의 댓글