728x90
728x90
Excutors
엄청나게 많은 쓰레드를 개발자가 관리하는 것은 사실상 불가능하다. 따라서 Executor를 활용하여 쓰레드를 관리하게 된다.
Executer는 ExcutorServie와 ScheduledExecutorService가 있다. ExcutorService는 쓰레드를 만들어주고 동작하는 역할만 수행한다면, ScheduledExecutorService는 쓰레드들을 각자 얼마나 뒤에 실행할지를 입력할 수 있어, 스케쥴링하여 실행해준다.
ExecutorService
//사용되는 runnable 메소드
private static Runnable getRunnable(String message) {
return () -> {
System.out.println(message + ":" + Thread.currentThread().getName());
};
}
ExecutorService executorService = Executors.newFixedThreadPool(2);
//작업 처리 후 종료 안됨 -> 다음 작업 올 때 까지 계속 대기함
executorService.submit(getRunnable("hello"));
executorService.submit(getRunnable("my"));
executorService.submit(getRunnable("name"));
executorService.submit(getRunnable("is"));
executorService.submit(getRunnable("jinseop"));
//쓰래드를 직접 종료해주어야함.
executorService.shutdown();
- ExcutorService를 생성하는 방법은 Excutors를 활용하면 된다. newFixedThreadPool()을 사용해서 파라미터로 쓰레드의 개수를 입력받게 된다.
- 그리고 쓰레드가 처리할 일은 submit으로 Runnable functional Interface를 받아서 처리가 이루어진다.
- 현재 보유하고 있는 쓰레드는 2개인데 실행되는 작업이 5개이다. 이것이 가능한 이유는 Blocking Queue에 작업을 넣어두고 쓰레드 두개가 작업을 꺼내며 처리하기 때문이다.
- 쓰레드풀을 보유하고 있어 따로 쓰레드를 만들어줄 필요가 없으니 자원적인 효율성도 좋다.
- 쓰레드로 작업을 모두 완료하였다면 마지막에 직접 executorService를 종료시켜주어야한다.
ScheduledExecutorService
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.schedule(getRunnable("hello"),3, TimeUnit.SECONDS);
scheduledExecutorService.schedule(getRunnable("world"),1,TimeUnit.SECONDS);
//반복 실행 1초 뒤 실행 2초 간격으로 반복실
scheduledExecutorService.scheduleAtFixedRate(getRunnable("hello!"),1,2, TimeUnit.SECONDS);
- ScheduledExecutorService를 하나의 쓰레드만 사용하는 스케쥴러로 선언해주었다.
- schedule()에 작업을 정의해준다. Runnable을 넣어주어 쓰레드의 동작을 정의하고, 몇초 뒤에 처리할 지 입력하여주기만 하면 실행이 된다.
- 위 예시에서 보면 world는 1초, hello는 3초의 딜레이가 있으므로 world 다음에 hello가 출력될 것이다.
- 만약 실행을 반복처리하고싶으면 scheduleAtFixedRate()를 사용하면 된다.
- 위 예시의 쓰레드를 살펴보면 "hello!"를 출력하는 쓰레드를 생성하는데 1초 뒤부터 실행되며 2초마다 동작을 하도록 구현한 것이다.
728x90
728x90
'Language > Java' 카테고리의 다른 글
CompletableFuture로 비동기 프로그래밍 공부하기! (0) | 2022.03.04 |
---|---|
자바 쓰레드 Callable과 Future (0) | 2022.03.03 |
자바 쓰레드의 기초 (0) | 2022.03.03 |
Java8의 시간 API 알아보기(LocalDateTime, Instant 등) (0) | 2022.03.01 |
Optional을 알아보자! (0) | 2022.02.27 |