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() -> nullfuture.get() -> throw 예외객체submit(Runnable task, Integer result)
future.get() -> intfuture.get() -> throw 예외객체submit(Callable<String> task)
future.get() -> Stringfuture.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();
}
}
});