일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- JSP
- SQL
- 서브쿼리
- 세션
- 프레임워크
- 자바
- toUpperCase
- 서블릿
- STS
- 기술 대비
- order by
- 인텔리제이
- Join
- 코테
- 뉴렉처
- 프로그래머스
- 김영한
- Model2
- AOP
- select
- MVC2
- @RestController
- DDL
- @Controller
- 스프링
- MVC
- 메이븐
- 인프런
- Model1
- 코딩테스트
- Today
- Total
Heestory
[JAVA]Future 본문
List<Future<String>> futures = new ArrayList<Future<String>>();
future.add(completionService.AAA);
회사 코드 분석 중 위와 같은 소스가 나와 future에 대해 알아보기로 한다.
Future
:java.util.concurrent 패키지에서 제공됨
비동기적으로 실행되는 작업의 결과를 나타내는 인터페이스
비동기적으로 실행되는 작업이 완료될 때까지 기다릴 수 있는 방법을 제공하여 다른 작업을 수행하는 동안 결과를 기다리지 않아도 된다.
메서드
- cancel(boolean mayInterruptIfRunning)
: 해당 Future 실행을 취소.
mayInterruptIfRunning 매개변수는 현재 작업이 실행 중인 경우 해당 작업을 중단해야 하는지 여부를 나타냄. - isCancelled() : Future가 취소되었는지 여부를 반환
- isDone(): Future의 작업이 완료되었는지 여부를 반환
- get(): 작업이 완료될 때까지 기다리고, 그 결과를 반환. 만약 작업이 이미 완료되었다면, 결과를 즉시 반환.
- get(long timeout, TimeUnit unit)
: 최대 timeout 시간까지 작업이 완료될 때까지 기다리고, 그 결과를 반환
timeout은 기다리는 시간을 나타내며, unit은 시간 단위를 나타냄
ExecutorService / CompletionService
:멀티 스레드를 쉽게 다룰 수 있도록 도와주는 인터페이스
CompletionService
:비동기적으로 작업을 실행하고 작업이 완료될 때마다 결과를 가져올 수 있는 유틸리티 클래스
작업이 완료되는 순서대로 결과를 가져오므로, 먼저 완료된 작업의 결과를 먼저 처리
ExecutorCompletionService 클래스를 구현하는 방식으로 사용
작업이 완료되는 순서대로 결과를 가져올 수 있으므로, 다수의 작업 처리시 유리
ExecutorService의 기능을 보완하는 인터페이스
take() 메서드를 사용하여 작업이 완료된 Future 객체를 가져오며, 더 이상 가져올 결과가 없을 때까지 블로킹
ExecutorService
: 스레드 풀을 사용하여 작업을 처리할 수 있도록 지원하는 인터페이스
Runnable 또는 Callable 객체를 받아서 처리하며, 작업이 완료되면 Future 객체를 반환(Callable의 경우)
submit() 또는 execute() 메서드를 사용하여 작업을 제출
shutdown() 또는 shutdownNow() 메서드를 사용하여 종료
ExecutorCompletionService
:ExecutorService 인터페이스를 상속받아서 작업을 실행
작업이 완료되는 순서대로 결과를 가져올 수 있도록 작업 큐를 유지
submit() 메서드를 사용하여 작업을 제출하며 take() 메서드를 사용하여 작업이 완료되면 결과를 가져온다.
take() 메서드는 결과가 완료되지 전까지 블록된다.
사용예)
ExecutorService executorService = Executors.newFixedThreadPool(10);
CompletionService<Integer> completionService = new ExecutorCompletionService<>(executorService);
for (int i = 0; i < 10; i++) {
final int taskNumber = i;
completionService.submit(() -> {
// 비동기적으로 실행되는 작업
return taskNumber;
});
}
for (int i = 0; i < 10; i++) {
Integer result = completionService.take().get();
System.out.println("Result: " + result);
}
executorService.shutdown();
- ExecutorCompletionService를 생성하고, 10개의 작업을 submit() 메서드를 사용하여 제출
- take() 메서드를 사용하여 작업이 완료되면 결과를 가져온다.
- 가져온 결과를 출력하고, ExecutorService를 종료한다.
'개발(~국비) > JAVA' 카테고리의 다른 글
[JAVA]Thread (0) | 2023.04.11 |
---|---|
[JAVA]subList (0) | 2023.04.10 |
ArrayIndexOutOfBoundsException 예외 발생 원인 (0) | 2022.10.27 |
JAVA)배열 출력 하는 방법 (0) | 2022.10.27 |