-스레드 객체는 상당한 양의 메모리를 사용하며 대규모 응용 프로그램에서 많은 스레드 개체를 할당 및 해체하면 상당히 메모리 관리 오버 헤드가 발생한다.
-Executor는 작업 스레드(worker threads)로 이루어진 스레드 풀(thread pools)을 사용한다.작업 스레드는 스레드 생성으로 인한 오버 헤드를 최소화한다.
-예를들어 웹서버에 request를 요청하면 thread를 만들어 요청을 처리하는데 수많은 request에 각각 thread를 생성하고 해제하는 것은 오버헤드가 너무 커서 웹서버의 속도가 느려진다.
따라서 thread를 많이 만들어서 각각의 task를 thread에 할당하고 다른 request가 들어오면 이를 처리하고 이를 thread pool이라하며 작업을 수행중인 thread를 worker thread라고 한다.**
void execute(Runnable command)
Future<T> submit(Callable<T> task)
public class ExecutorServiceEx {
public static void main(String[] args) {
RestRoom restRoom = new RestRoom();
//화장실을 사용하는 runnable task
Runnable r = ()->restRoom.use();
//worker thread가 2개 있는 thread pool 생성
ExecutorService service = Executors.newFixedThreadPool(2);
//2개의 worker thread가 4개의 thread 실행행
service.execute(r);
service.execute(r);
service.execute(r);
service.execute(r);
//진행중인 task 종류 후에 서비스 종료, ExecutorService는 shutdown()하지않으면 끝나지 않는다.
service.shutdown();
}
}
출력
> Task :ExecutorServiceEx.main()
Thread[pool-1-thread-1,5,main] : 화장실에 들어갔다
Thread[pool-1-thread-1,5,main] : 화장실에 나왔다.
Thread[pool-1-thread-2,5,main] : 화장실에 들어갔다
Thread[pool-1-thread-2,5,main] : 화장실에 나왔다.
pool-1-thread-1 : 손을 씻었다.
Thread[pool-1-thread-1,5,main] : 화장실에 들어갔다
pool-1-thread-2 : 손을 씻었다.
Thread[pool-1-thread-1,5,main] : 화장실에 나왔다.
Thread[pool-1-thread-2,5,main] : 화장실에 들어갔다
pool-1-thread-1 : 손을 씻었다.
Thread[pool-1-thread-2,5,main] : 화장실에 나왔다.
pool-1-thread-2 : 손을 씻었다.
ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay, long period, TimeUnit unit)
public class SchedulerEx {
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable beeper = () -> System.out.println("beep ");
//(task, initialDelay, period, unit)
//beep task를 1초 후부터 1초 간격으로 실행
scheduler.scheduleAtFixedRate(beeper, 0, 1, TimeUnit.SECONDS);
}
}
출력
> Task :SchedulerEx.main()
beep beep beep beep beep beep beep beep beep beep beep //반복