본문 바로가기
Efficient Android Threading #8 AsyncTask 로 백그라운드 태스크를 UI 스레드에 묶기 Efficient Android Threading #8 AsyncTask 로 백그라운드 태스크를 UI 스레드에 묶기 이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.자세한 내용은 책을 구입해서 보세용.10.1. 기본 사항 -AsyncTask 는 실행이 완료되면 다시 실행할 수 없다.즉, execute 메서드는 일회성의 동작이고 스레드의 동작처럼 AsyncTask 인스턴스마다 오직 한 번만 호출할 수 있다. -doInBackground 작업이 끝나면 onPostExecute 혹은 onCancelled 둘 중 하나만 수행된다. ** 10.1.1 생성과 시작 -AsyncTask 의 기본 생성자는 UI 스레드에서 호출되어야 한다.젤리빈 이전의 플랫폼에서 UI 스레드가.. 2018. 3. 24.
Efficient Android Threading #7 Executor 프레임워크를 통한 스레드 실행 제어 Efficient Android Threading #7 Executor 프레임워크를 통한 스레드 실행 제어 이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.자세한 내용은 책을 구입해서 보세용.9.1. Executor -Executor 는 interface 로 void execute(Runnable command); 하나의 함수를 갖는다.단순하지만 강력하다. 이는 테스크를 만드는 것과 실행 사이에 분리를 확실하게 해주기 때문에 기본 Thread 인터페이스보다 더 자주 사용된다. -public class SimpleExecutor implements Executor { @Override public void execute(Runnable runnable){ new.. 2018. 3. 23.
Efficient Android Threading #4 메모리 관리 Efficient Android Threading #4 메모리 관리 이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.자세한 내용은 책을 구입해서 보세용.6.1. 가비지 컬렉션 -각 프로세스(결과적으로 각 앱)는 자신만의 VM 과 가비지 컬렉터를 가진다. -진저브레드까지 안드로이드의 가비지 컬렉션은 메모리가 회수되는 동안 앱 실행이 중지되는 순차적 실행이었다.이는 UI rendering 의 일시적 멈춤으로 이어질 수 있었다.허니컴부터 GC 는 앱 스레드를 중지하지 않고 자체 스레드에서 동시적으로 실행된다. -달빅 GC 는 mark & swap 이라는 일반적인 두 단계 메커니즘을 사용한다.마크 단계는 객체 트리를 탐색하고 다른 객체에 의해 참조되지 않는 모든 미사.. 2018. 3. 20.
Efficient Android Threading #2 스레드 통신 Efficient Android Threading #2 스레드 통신 이 글은 Efficient Android Threading 의 일부 내용만 발췌한 내용입니다.자세한 내용은 책을 구입해서 보세용. 4.1. 파이프 -파이프는 두 개의 연결된 스레드끼리만 접근할 수 있는 메모리에 할당된 버퍼다.두 개의 스레드 이외의 다른 스레드는 데이터에 접근할 수 없다.따라서 스레드 안전이 보장된다.파이프는 단방향이기 때문에 한 스레드는 쓰기만 하고 다른 하나는 읽기만 한다. 일반적으로 파이프는 두 개의 긴 실행 테스크가 있고 하나의 테스크에서 다른 테스크로 계속해서 데이터를 옮길 때 사용된다. -파이프는 바이너리 데이터와 문자 데이터 중 하나를 전송할 수 있다.PipedOutputStream(생산자)와 PipedInp.. 2018. 3. 18.
[Java Concurrency] 자바 메모리 모델 [Java Concurrency] 자바 메모리 모델 - 자바 메모리 모델(JMM, Java Memory Model) 의 내부 구조가 어떻게 동작하는지를 이해하고 있다면 상위 개념을 훨씬 효율적으로 쉽게 사용할 수 있을 것이다. 16.1. 자바 메모리 모델은 무엇이며, 왜 사용해야 하는가? - 특정 스레드에서 aVariable 이라는 변수에 값을 할당한다고 해보자. aVariable = 3; 자바 메모리 모델은 "스레드가 aVariable에 할당된 3이란 값을 사용할 수 있으려면 어떤 조건이 돼야 하는가?" 에 대한 답을 알고 있다. 동기화 기법을 사용하지 않는 상태라면 특정 스레드가 값이 할당되는 즉시, 심지어는 영원히 3이라는 값을 읽어가지 못하게 하는 여러 가지 상황이 발생할 수 있다. - JMM 은.. 2017. 5. 10.
[Java Concurrency] 중단 및 종료 #2 [Java Concurrency] 중단 및 종료 #2 7.3. 비정상적인 스레드 종료 상황 처리 - 스레드를 예상치 못하게 종료시키는 가장 큰 원인은 바로 RuntimeException 이다. RuntimeException 은 대부분 프로그램이 잘못 짜여져서 발생하거나 기타 회복 불가능의 문제점을 나타내는 경우가 많기 때문에 try_catch 구문으로 잡지 못하는 경우가 많다. RuntimeException 은 호출 스택을 따라 상위로 전달되기보다는 현재 실행되는 시점에서 콘솔에 스택 호출 추적 내용을 출력하고 해당 스레드를 종료시키도록 되어 있다. - 스레드 풀에서 사용하는 작업용 스레드나 스윙의 이벤트 처리 스레드와 같은 작업 처리용 스레드는 항상 Runnable 등의 인터페이스를 통해 남이 정의하고.. 2017. 4. 26.
[Java Concurrency] 중단 및 종료 #1 [Java Concurrency] 중단 및 종료 #1 - 작업이나 스레드를 안전하고 빠르고 안정적으로 멈추게 하는 것은 어려운 일이다. 더군다나 자바에는 스레드가 작업을 실행하고 있을 때 강제로 멈추도록 하는 방법이 없다. 대신 인터럽트(interrupt)라는 방법을 사용할 수 있게 되어 있는데, 인터럽트는 특정 스레드에게 작업을 멈춰달라고 요청하는 형태이다. 실제 상황에서 특정 스레드나 서비스를 "즉시" 멈춰야 할 경우는 거의 없고, 강제로 종료하면 공유되어 있는 여러 가지 상태가 비정상적인 상태에 놓일 수 있기 때문에 스레드 간의 협력을 통한 접근 방법이 올바르다. 다시 말해, 작업이나 서비스를 실행하는 부분의 코드를 작성할 때 멈춰달라는 요청을 받으면 진행 중이던 작업을 모두 정리한 다음 종료하도록.. 2017. 4. 25.
[Java Concurrency] 작업 실행 [Java Concurrency] 작업 실행 - 앱이 해야 할 일을 "작업"이라는 단위로 분할하면 프로그램의 구조를 간결하게 잡을 수 있고, 트랜잭션의 범위를 지정함으로써 오류에 효과적으로 대응할 수 있고, 작업 실행 부분의 병렬성을 자연스럽게 극대화 할 수 있다. 6.1. 스레드에서 작업 실행 - 프로그램에서 일어나는 일을 작업이라는 단위로 재구성하고자 한다면 가장 먼저 해야 할 일은 작업의 범위를 어디까지로 할 것인지 정하는 일이다. 원론적으로 보자면 작업은 완전히 독립적인 동작을 말한다. 독립성이 갖춰져 있어야 병렬성을 보장할 수 있다. 작업을 스케쥴링하거나 부하 분산(load balancing)을 하고자 할 때 폭넓은 유연성을 얻으려면 각 작업이 앱의 전체적인 업무 내용 가운데 충분히 작은 부분을.. 2017. 4. 24.
[Java Concurrency] 구성 단위 #2 [Java Concurrency] 구성 단위 #2 5.4. 블로킹 메소드, 인터럽터블 메소드 - 스레드는 여러 가지 원인에 의해 블록 당하거나, 멈춰질 수 있다. 스레드가 블록되면 동작이 멈춰진 다음 블록된 상태(BLOCKED, WAITING, TIMED_WAITING) 가운데 하나를 갖게 된다. 블로킹 연산은 단순히 실행 시간이 오래 걸리는 일반 연산과는 달리 멈춘 상태에서 특정한 신호를 받아야 계속해서 실행할 수 있는 연산을 말한다. ( I/O 작업 끝나기를 기다리거나, 기다리던 락을 확보하거나, 다른 스레드의 작업 결과를 받아오는 등의 신호 ) - Thread 클래스는 해당 스레드를 중단시킬 수 있도록 interrupt 메소드를 제공하며, 해당 스레드에 인터럽트가 걸려 중단된 상태인지를 확인할 수 .. 2017. 4. 21.
반응형