본문 바로가기
Java

Future를 이용한 블로킹 방식의 작업 완료 통보 방법

by jayden-lee 2019. 4. 29.
728x90

Future 블로킹 방식의 작업 완료 통보

ExecutorService의 submit() 메서드는 매개값으로 준 Runnable 또는 Callable 객체를 스레드풀의 작업 큐에 저장하고 즉시 Future 객체를 반환한다. Future 객체는 작업이 모두 완료될 때까지 기다렸다가 최종 결과값을 얻는데 사용한다.

 

Future를 지연 완료(pending completion) 객체라고 한다. Future 클래스의 get() 메서드를 호출하면 스레드가 작업을 완료할 때까지 블로킹 상태로 머무르다가 작업이 완료되면 처리 결과를 반환한다. 이 방법이 블로킹을 사용하는 작업 완료 통보 방식이다.

 

아래는 Future 클래스의 get() 메서드 설명이다.

 

  • get() : 작업이 완료될 때까지 지연했다가 처리 결과를 반환한다.
  • get(long, TimeUnit) : 시간 내에 작업이 완료되면 결과값을 반환하지만, 작업이 완료되지 않으면 예외를 발생시킨다.

이처럼 Future의 get() 메서드를 main 스레드에서 호출하게 되면 블로킹 되어서 다음 로직이 처리 되지 않게 된다. UI를 변경하거나 이벤트를 처리하는 곳에서는 화면이 멈춰 있는 것처럼 사용자에게 보일 수도 있기 때문에 Future.get() 메서드는 사용할 때 주의해야 한다.

 

이러한 문제를 피하기 위해서는 get() 메서드의 호출은 다른 스레드 또는 다른 스레드풀에서 사용되어야 한다. 이러한 방식으로 바꾸면 블로킹 방식이 일어나더라도 기본 로직(main 스레드)은 멈추지 않고 이어서 다음 로직을 이어서 처리할 수 있다. 메인 스레드에서 계속 처리를 하던 중 get() 메서드에서 결과 값이 반환되면, 그 값을 다시 main 스레드로 넘겨 받아서 사용하면 된다.

댓글