4,563,366 th visitor since 2017.2.1 ( Today : 260 )
Programming
No. 696
Name. swindler
Subject. Executors Class
Main Cate. Java
Sub Cate.
Date. 2013-02-13 14:02
Hit. 3003 (211.36.27.3)
File.
JDK 1.5 이상 버젼에서 부터 등장한 concurrent package에 포함되었다.

Executors 는 쓰레드풀을 이용하여 쓰레드를 보다 효과적이고 안전하게 사용하게끔 도와준다.
Executors 에는 개발자들이 필요로 하는 대부분의 ExecutorService 들을 제공하는 static 펙토리 메소드를 제공하는데
그 외에 무언가 더 특별한 녀석을 만들고하 한다면 ThreadPoolExecutor 클래스를 직접 사용해도 된다.

제공하는 ExecutorService 에는 여러가지가 있다.
그중에서 중요한 4개 정도만 살펴보자.

newCachedThreadPool
newFixedThreadPool
newScheduledThreadPool
newSingleThreadExecutor

위의 펙토리 메서드들로 부터 반환되어 나오는 ExecutorService 을 살펴보면
쓰레드를 시작과 종료 시킬수 있는 메서드들이 존재한다.


execute - 인자로 Runnable 를 구현한 객체를 받는다.
submit - 인자로 Callable, Runnable 을 구현한 객체를 받을수 있다.

shutdown - 쓰레드를 중단한다 현재 진행중인 작업은 중단되지 않는다.
shutdownNow - 쓰레드를 당장 중단한다. 진행중인 작업도 함께 중단된다.

isTerminated - 현재 작업이 끝났는지 여부를 반환해 준다.
isShutdown - 현재 쓰레드가 중단되었는지 여부를 반환해 준다.



1. newSingleThreadExecutor 요녀석은 단일 쓰레드일 경우 사용된다고 한다.
한번 중단하면 다시 사용할수 없는 녀석이니 이부분을 염두해서 구현하도록 하자.

ex)
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() {
public void run()
{
... 로직 구현 ...
}
});
executor.shutdown();

shutdown 은 꼭 시켜줘야 하며 shutdown 이 되지 않았을 경우 프로그램이 뻗어버리거나
잘못 수행되는 경우가 발생하게 된다.
잊지 말고 쓰레드를 모두 사용하였으면 shutdown 메소드로 쓰레드풀을 종료해줘야 한다.
newFixedThreadPool newCachedThreadPool 펙토리 메서드들도 반환형을 보면
newSingleThreadExecutor 와 같은 ExecutorService 임으로 사용법은 마찬가지이다.

2. ExecutorService executor = Executors.newFixedThreadPool(10);
newFixedThreadPool 의 경우 위와 같이 생성하며 정해진 갯수만큼만 Thread 를 생성하여 저장하고 있으며
모든 쓰레드가 사용되고 있는 상태에서 새로운 작업요청이 오더라도 최대 정해진 갯수 이상으로 쓰레드를 생성하지 않는다.


3. ExecutorService executor = Executors.newCachedThreadPool();
newCachedThreadPool 의 경우에는 쓰레드를 저장하고 있다가 들어오는 작업 요청에 따라 유연하게
쓰레드를 종료시키거나 생성 시킬수 있다.
노는 쓰레드가 많으면 알아서 판단하여 쓰레드를 종료하거나 반대의 경우 쓰레드를 생성하여 유연하게 작업을 수행한다.
가용한 프로세스보다 더 많은 양의 작업을 처리해야될 경우가 있을 경우 사용하지 않기를 권한다.

4. ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
newScheduledThreadPool 의 경우 말 그대로 스케줄러 역활을 하며 일정시간 마다 주기적으로 반복하며 작업을 실행할수 있다.
반환형은 ScheduledExecutorService Interface 이고 scheduleAtFixedRate 메소드로 주기적인 반복을 시작할수 있다.

executor.scheduleAtFixedRate(instance, 시작시간, 반복시간, 시간단위);
( instance 는 Runnable 을 구현한 객체이며 시간 단위는 TimeUnit Enum 에 선언되어있다. 요걸 가져다 쓰도록 한다. )


[바로가기 링크] : http://coolx.net/cboard/develop/696



Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog