Executor 프레임워크를 사용하면 다음과 같은 일들을 처리할 수있습니다.
- 스레드에서 실행되기를 기다리는 task 수를 제어하는 작업자 스레드 pool과 큐를 설정 - 비정상적으로 종료되는 스레드를 초래하는 에러 확인 - 완료되는 스레드를 기다리고 스레드로부터 결과를 가져온다. - 스레드의 일괄처리를 실행하고, 고정된 순서로 결과를 가져온다. - 사용자가 더 빨리 결과를 확인할 수 있도록 알맞은 시간에 백그라운드 스레드를 시작한다. |
Excutor 프레임워크의 기본 구셩요소는 Executor 인터페이스다.
이것의 주요목표는 태스크의 생성을 분리하여(Runnnalbe) 앞에서 나열한 응용프로그램 동작들을 가능하게 하는 것이다.
이 인터페이스는 단하나의 메서드를 포함한다.
public interface Executor{ void execute(Runnalbe command); } |
Executor 로 제어할 수 있는 동작으로는 다음과 같다.
- 태스크 큐잉
- 태스크 실행순서
- 태스크 실행 유형(직렬 또는 동시)
Executor 예제
AsyncTask에서 사용된 직렬 Task 실행자를 구현. SerialExecutor는 생산자-소비자 패턴으로 구현
Thread는 Runnable Task를 생성하고, 큐에 Task를 배치하며, 소비자 스레드는 큐에서 Task 를 제거하고 처리한다.
실행자 실행동작특징은 다음과 같다.
- 태스크 큐잉
ArrayDeque - 데큐, 양방향으로 꺼낼 수 있는 큐.
스레드에 의해 처리될떄까지 삽입된 Task들을 보유한다.
- 태스크 실행순서
모든 태스크는 mTask.offer()를 통해 데큐의 끝에 넣어진다. 따라서
결과는 삽입된 태스크들 fifo 순서다.
- 태스크 실행 유형
Task는 직렬로 실행되지만, 같은 스레드에서 실행될 필요없다.
Task가 실행완료할떄 마다 r.run()이 완료할떄마다, scheduleNext()가 호출된다.
이것은 큐에서 다음 Task를 가져와서 스레드가 Task그를 실행할 수 있는 스레드 풀안의 다른 Executor로 보낸다.
요컨대 SerialExecutor는 각각 다른 스레드에서 Task를 처리할 수 있으며 Task들의 순차적인 실행을 보장하는 실행환경을
구성한다.
<순차실행이지, 동시실행은 아님>
'안드로이드 > Thread' 카테고리의 다른 글
자바 안드로이드 custom thread pool (커스텀 스레드 풀) (0) | 2017.12.06 |
---|---|
자바 안드로이드 Thread pool (스레드 풀) (0) | 2017.12.06 |
Thread or Task(스레드 및 태스크) 설계 및 실행 전략 (0) | 2017.07.29 |
자바 스레드 암시적 잠금 종류 및 생산자와 소비자 (0) | 2017.07.28 |
스레드 안전, Thread safety (0) | 2017.07.28 |