ExecutorService
의 .submit()
메소드는 스레드 작업으로 준 Runnable
혹은 Callable
작업을 스레드 풀의 작업 큐에 저장하고 즉시 Future
객체를 반환한다.
Future<?> submit(Runnable task)
Future<V> submit(Runnable task, V result)
Future<V> submit(Callable<V> task)
Future
객체는 단순히 작업 결과를 받는 것이 아니라 작업이 완료될 때까지 기다렸다가 최종 결과를 얻는데 사용된다. Future
를 지연 완료(pending completion) 객체라고도 한다.
Future
의 .get()
메소드를 호출하면 스레드가 작업을 완료할 때까지 블로킹되었다가 작업을 완료하면 처리 결과를 리턴한다. 이것이 블로킹을 사용하는 작업 완료 통보 방식이다.
V get()
: 작업이 완료될 때까지 블로킹되었다가 처리 결과 V
를 반환한다.V get(long timeout, TimeUnit unit)
: timeout 시간 전에 작업이 완료되면 결과 V를 리턴하지만, 작업이 완료되지 않으면 TimeoutException
을 발생시킨다.submit(Runnable task)
future.get() -> null
future.get() -> throw 예외객체
submit(Runnable task, Integer result)
future.get() -> int
future.get() -> throw 예외객체
submit(Callable<String> task)
future.get() -> String
future.get() -> throw 예외객체
new Thread(new Runnable() {
@Override
public void run() {
try {
future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
executorService.submit(new Runnable() {
@Override
public void run() {
try {
future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
});