[CS/운영체제] 멀티스레드와 동시성 - 37부

황제연·2025년 8월 8일
0

CS학습

목록 보기
160/193
post-thumbnail

Future의 주요 메소드

boolean cancel(boolean mayInterruptIfRunning)

아직 완료되지 않은 작업을 취소하는 기능을 갖고 있습니다

cancel(true): Future를 취소상태로 변경하고 작업이 실행중이라면,
Thread.interrupt()를 호출해서 작업을 중단합니다

cancel(false): Future를 취소상태로 변경하며, 이미 실행중인 작업을 중단하지는 않습니다

반환값: 작업이 성공적으로 취소되면 true를 반환하며 이미 완료되었거나 취소할 수 없는 경우 false를 반환합니다

참고로 취소 상태의 Future에 Future.get()을 호출하면 CancellationException 런타임 예외가 발생합니다

boolean isCancelled()

작업이 취소되었는지 여부를 확인하며, 작업이 취소된 경우 true를 반환하고 아니라면 false를 반환합니다
이때, 작업이 cancel() 메소드에 의해 취소된 경우에 true를 반환합니다

boolean isDone()

작업이 완료되었는지 여부를 확인합니다
작업이 정상적으로 완료되었거나 취소되거나 예외가 발생해서 종료된 경우 true를 반환합니다
그렇지 않다면 false를 반환합니다

State state()

Future의 상태를 반환합니다 자바 19부터 지원하는 기능입니다

  • RUNNING: 작업 실행 중
  • SUCCESS: 성공 완료
  • FAILED: 실패 완료
  • CANCELLED: 취소 완료

V get()

작업이 완료될 때까지 대기하고 완료되면 결과를 반환합니다
작업의 결과를 반환합니다
IntterruptedException은 대기 중에 현재 스레드가 인터럽트된 경우 발생하며,
ExecutionException은 작업 계산 중에 예외가 발생한 경우 발생합니다

작업이 완료될 때까지 get()을 호출한 현재 스레드를 대기합니다
작업이 완료되면 결과를 반환합니다

V get(long timeout, TimeUnit unit)

get()과 같은데 시간이 초과되면 예외를 발생합니다
timeout은 대기할 최대시간이며 unit은 timeout 매개변수의 시간 단위를 지정하는 것입니다
앞선 V get()의 예외와 더불어 추가로 TimeoutException 예외가 발생하는데
이것은 주어진 시간 내에 작업이 완료되지 않은 경우 발생합니다

Cancel 예제

boolean cancelRes = future.cancel(true);

try{
	Integer res = future.get();
}catch(CancellationException e){
	.....
}catch(InterruptedException | ExecutionException e){
	.....
}

true를 넘겨주면 실행중인 작업에 인터럽트가 발생해서 실행중인 작업을 중지시도합니다
이후, Future.get()을 호출하면 CancellationException 런타임 예외가 발생합니다

Exception 예제

Future.get()을 호출하면 작업의 결과값 뿐만 아니라, 작업 중에 발생한 예외도 받을 수 있습니다
Future의 상태가 FAILED면 내부에서 발생한 예외를 ExecutionException 예외를 던져,
원본 예외를 e.getCause()를 호출해서 받을 수 있습니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글