brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Oct 02. 2018

동시성(Concurrency)

#68 스레드 그룹보다는 실행자와 작업을 사용하자

Effective Java - 동시성(Concurrency)


#68 스레드 그룹보다는 실행자와 작업을 사용하자


#01 work queue


안드로이드에서도 looper 내에 queue가 있습니다.

이런 work queue를 직접 작성하려면 신경 쓸게 많은데 java.util.concurrent에서 제공하는 실행자 프레임워크(Executor Framework)를 이용하면 쉽게 만들 수 있습니다.


실행자와 작업을 이용한 구현 방법에 대해 알아보겠습니다.




실행자(Executor)


#02 Executor service


아래와 같이 간단하게 구현할 수 있습니다.

Executors 클래스에서 제공하는 newSingleThreadExecutor static 메서드를 이용하면, 단일 스레드를 이용한 ExecutorService를 생성할 수 있습니다.


만약 하나 이상의 스레드를 통해 작업 큐의 작업들을 처리한다면 newFixedThreadPool 메서드를 통해 스레드 풀(thread pool)을 만들 수 도 있습니다.

스레드 풀 : 스레드를 미리 생성해 놓고 필요시 재 사용하는 방법


실행자 서비스(ExecutorService)에서 제공하는 API들을 통해 다른 작업들도 쉽게 구현할 수 있습니다.

shutdown : 종료

invokeAny, invokeAll : 작업이 완료되기를 기다림

awaitTermination : 실행자 서비스 종료 완료되기를 기다림




작업(Task)


작업에는 RunnableCallable 두 가지가 있습니다.

#03 Task


Runnable은 void로 반환 타입이 없고, Callable은 Object로 반환 타입이 있습니다.

이 두 작업은 ExecutortService를 통해 실행(execute, submit)됩니다.




안드로이드에서도 HandlerThread나 AsyncTask 같은 Thread helper class들이 있듯이, 자바에서도 ExecutorService를 통해 좀 더 간편하게 Thread 작업들을 처리할 수 있습니다.

매거진의 이전글 동시성(Concurrency)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari