Programing/Java

Executor service

BUST 2018. 8. 31. 23:49

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);


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