Executor Service
- 비동기 작업을 손쉽게 사용할수 있게 제공하는 프레임워크
- 작업을 실행할수 있는 스레드풀을 제공한다.
Factory Method을 이용하여 생성하는 방법
ExecutorService executor = Executors.newFixedThreadPool(10);
직접 생성을 하는 방법
ExecutorService executorService =
new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
(r, e) -> { log.error("Queue Overflow") };
- Runnable에 대한 Queue와 Core Thread Pool, Max Thread Pool, Thread Pool Alive Time 등을 설정을 할수 있다.
- 고정된 Thread Pool와 Queue의 크기를 지정을 할수가 있다.
- 만약 Task(Runnable)이 밀려 Task가 사라지지 않도록 조심해야 된다.
- Thread Pool 내에서 작업을 하고 있는 작업이 밀리는 경우에는 후에 들어오는 메시지는 Queue만큼 쌓이는데, Queue가 들어갈수 있는 사이즈가 넘어간다면 메시지가 유실이 된다. 이점을 주의하고 개발을 해야 된다.
- Timeout이 가능한 ThreadPoolExecutor를 개발하는 것도 하나의 방법일듯.
Runnable 을 ExeuctorService을 통해 실행하기
Runnable runnableTask = () -> {
try {
TimeUnit.MILLISECONDS.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
executorService.execute(runnableTask);
Callable<String> callableTask = () -> {
TimeUnit.MILLISECONDS.sleep(300);
return "Task's execution";
};
Future<String> future = executorService.submit(callableTask);
List<Callable<String>> callableTasks = new ArrayList<>();
callableTasks.add(callableTask);
callableTasks.add(callableTask);
callableTasks.add(callableTask);
String result = executorService.invokeAny(callableTasks);
List<Future<String>> futures = executorService.invokeAll(callableTasks);
List<Future<String>> futures = executorService.invokeAll(callableTasks);
Executor service 종료하기
executorService.shutdown();
'Programing > Java' 카테고리의 다른 글
Singleton Pattern (0) | 2018.09.06 |
---|---|
SLF4J(Simple Logging Facade for Java) (0) | 2018.09.01 |
Java Generic (제너릭) (0) | 2018.08.14 |
GC overhead limit exceeded (0) | 2018.08.10 |
전략 패턴 (Strategy Pattern) (0) | 2018.08.04 |