Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 자바 비동기 프로그래밍 파헤치기 - Executor - 자바8 docs 번역
- ## SubInterface
- ExecutorService, ScheduledExecutorService
- ## 구현 클래스
- AbstractExecutorService, ForkJoinPool, SchduledThreadPoolExecutor, ThreadPoolExecutor
- ***
- **public interface Executor**
- 제출(submit)된 Runnable task를 실행하는 객체입니다. 이 인터페이스는 task submission(제출)을 다음의 과정들로부터 분리시키는 방식을 제공합니다. 그 과정에는 task의 운영, 스레드 사용의 세부사항, 스케쥴링 등등 이 있습니다.
- Executor는 대게 직접적으로 스레드를 생성하는 것을 대체해 사용됩니다.
- 예를 들어, new Thread(new(RunnableTask())).start() 를 각 task 셋에 대해 실행하는 것보다 다음과 같이 사용할 수 있습니다.
- ```
- Executor executor = _anExecutor_;
- executor.execute(new RunnableTask1());
- executor.execute(new RunnableTask2());
- ...
- ```
- 그러나 Executor 인터페이스는 엄격하게 비동기방식으로 실행되는 것을 엄격하게 필요로 하지 않습니다. 가장 간단한 케이스에서 executor 객체는 제출받은 task를 즉시 caller의 스레드에서 실행할 수 있습니다.
- ```
- class DirectExecutor implements Executor {
- public void execute(Runnable r) {
- r.run();
- }
- }
- ```
- ` 하지만 보통 이렇게 하려고 비동기 방식을 이용하진 않는다. `
- 대부분의 경우는 task들은 caller의 스레드보단 다른 스레드에서 실행됩니다. 아래의 executor 각각의 task에 대해 새로운 thread를 생성합니다.
- ```
- class ThreadPerTaskExecutor implements Executor {
- public void execute(Runnable r) {
- new Thread(r).start();
- }
- }
- ```
- 많은 Executor 구현들은 몇몇 제한을 task들이 어떻게 그리고 언제 스케쥴될지 몇가지 제한을 부과합니다.
- The executor below serializes the submission of tasks to a second executor, illustrating a composite executor.
- ` 아마 아래의 executor가 작업을 실행후 다음 executor를 실행해 큐의 작업을 연속으로(serialize) 실행하는 걸 설명하는 듯하다. `
- ` serialize가 직렬화를 말하는건지, 연속된 뭔가를 실행한다는 식의 의미로 쓰인건지 확실하지 않으므로 원문 그대로 넣었다`
- ```
- class SerialExecutor implements Executor {
- final Queue<Runnable> tasks = new ArrayDeque<Runnable>();
- final Executor executor;
- Runnable active;
- SerialExecutor(Executor executor) {
- this.executor = executor;
- }
- public synchronized void execute(final Runnable r) {
- tasks.offer(new Runnable() {
- public void run() {
- try {
- r.run();
- } finally {
- scheduleNext();
- }
- }
- });
- if (active == null) {
- scheduleNext();
- }
- }
- protected synchronized void scheduleNext() {
- if ((active = tasks.poll()) != null) {
- executor.execute(active);
- }
- }
- }
- ```
- ` active의 의미를 잘 모르겠으나 위 코드는 큐에 담긴 task들을 순차적으로 executor를 호출하며 비동기 방식으로 실행하는 코드인 듯하다 `
- Executor는 ExecutorService, ThreadPoolExecutor, Executors 의 상위에 있는 인터페이스이다.
- ExecutorService는 더 넓은 범위에 쓰이는 인터페이스이며,
- ThreadPoolExecutor는 확장 가능한 thread pool의 구현을 제공한다.
- Executors 클래스는 편리한 팩토리 메서드들을 지원한다.
- ## Methods
- ## execute
- void excute(Runnable command)
- 주어진 명령을 미래에 있을 어떤 시간에 해냅니다(execute. 단지 실행 자체의 의미는 아니다).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement