본문 바로가기
Language/Java

[java] Thread 작업 완료 확인 - Future

by 돈코츠라멘 2019. 9. 1.

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

  1. http://palpit.tistory.com/732

댓글