Future
"Blocking 방식의 작업 완료 통보"
Future 객체는 작업이 완료될 때까지 기다렸다가 최종 결과를 얻는 데 사용한다. 그래서 Future를 지연 완료(pending completion) 객체라고 한다.
ExecutorService의 submit()
메소드는 파라미터로 받은 Runnable 또는 Callable 작업을 Thread Pool의 작업 큐에 저장하고 즉시 Future 객체를 리턴한다. 이후 Future의 get()
메소드를 호출하면 Thread가 그 작업을 완료할 때까지 기다렸다가(Blocking!) 작업을 완료하면 처리 결과를 리턴한다.
Runnable
Runnable task = new Runnable() {
@override
public void run() {
// ...
}
}
결괏값이 없는 작업일 경우 Runnable 객체를 사용한다.
ExecutorService service = Executors.newSingleThreadExecutor();
Future future = service.submit(task);
ExecutorService에서 submit()
메소드를 호출하면 Future를 리턴한다.
try {
future.get();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
작업 처리가 정상적으로 완료되면 Future의 get()
메소드는 null을 리턴한다. 물론 리턴 값을 받을 때까지 get()
메소드를 호출한 Thread는 기다린다.
example
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
Runnable task = new Runnable() {
@Override
public void run() {
// ...
}
};
Future future = service.submit(task);
try {
future.get();
} catch (Exception e) {
// Exception Handling
}
}
Callable
Callable<T> task = new Callable<T>() {
@override
public T call() throw Exception {
// ...
return T;
}
}
결괏값이 있는 작업일 경우 Callable 객체를 사용한다.
ExecutorService service = Executors.newSingleThreadExecutor();
Future<T> future = service.submit(task);
ExecutorService에서 submit()
메소드를 호출하면 Future를 리턴한다. 여기서 T는 call()
메소드의 리턴 타입이다.
try {
T result = future.get();
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
작업 처리가 정상적으로 완료되면 Future의 get()
메소드는 Callable의 call()
메소드의 결괏값을 리턴한다. 마찬가지로 리턴 값을 받을 때까지 get()
메소드를 호출한 Thread는 기다린다.
example
public static void main(String[] args) {
ExecutorService service = Executors.newSingleThreadExecutor();
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
return "퇴근소취";
}
};
Future<String> future = service.submit(task);
try {
String futureResult = future.get();
System.out.println("futureResult: " + futureResult);
} catch (Exception e) {
// Exception Handling
}
}
futureResult: 퇴근소취
Reference
'Language > Java' 카테고리의 다른 글
Java GC(Garbage Collection) (0) | 2019.09.07 |
---|---|
[JVM] Java 메모리 구조 (0) | 2019.09.05 |
javaDoc에 샘플코드(xml 등) 작성하기 (0) | 2019.08.31 |
람다식(Lambda Expression) 아주아주 기초 문법 (0) | 2019.08.30 |
[java] RejectExecutionHandler reject policy - 작업 큐(workQueue)가 full인 상태에서의 처리 정책 (0) | 2019.08.30 |
댓글