1. ExecutorService
- Executor 상속받은 Interface로, Callable도 실행할 수 있으며, Executor를 종료시키거나, 여러 Callable을 동시에 실행하는 등의 기능을 제공함
- Runnable은 Return값이 없음, Callable은 특정 Type의 Object를 Return할 수 있음
- public interface Runnable { public abstract void run(); }
- public interface Callable<V> { V call() throws Exeption; }
- Thread 사용 시 실질적으로 사용하는 Interface임
- Executors Class의 Stataic Method를 활용해 구현하여 사용함
2. Executors
- Thread를 만들고 관리하는 것을 고수준의 API Executors에게 위임함
- Runnable만 개발자가 만들고 생성, 종료, 없애기 작업들은 Executors가 해줌
- Interface는 크게 Executor와 ExecutorService가 있지만, 실질적으로 ExecutorSerivce를 사용함
- 작업만 소스코드로 작성하면됨
- Executor, ExecutorService, ScheduledExecutorService, ThraedFactory 등을 정적 Factory Method를 지원해주는 Class임
2-1. Excutors의 역할
- Thread add : Application이 사용할 Thread Pool을 만들어 관리함
- Thread 관리 : Thread 생명 주기를 관리함
- 작업 처리 및 실행 : Thread로 실행할 작업을 제공할 수 있는 API를 제공함
3. Single Thread
- ExecutorService Interface와 Executors Class의 Static method를 이용해 ExecutorService를 구현하여 사용함
- 사용종료 후에는 종료 명령어를 이용해 종료함, 종료를 하지 않으면 다음 작업이 들어 올때까지 무한 대기를 함
- ex)
- 구현체 생성 → Executors.newSingleThreadExecutor()
- Executors Class의 Static Method를 활용하여 ExecutorSerice 구현체를 SingleThread 형태로 Return해줌
- 작업제출 → submit()
- Thread를 활용할 작업을 제출함(해당 Thread가 대기 중인 경우 제출한 작업을 처리함)
- 작업종료 → shutdown()
- 진행중인 작업을 마치고 Thread를 종료함(종료를 해줘야함, 안그러면 종료하지 않고 무한 대기를 하기 때문임)
- 즉시종료 → shutdownNow()
- 진행중인 작업을 마치지 않은 채로 종료할 수 있음(즉시종료)