ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Future 클래스 정리
    java 2021. 6. 3. 10:49

    배경

    Java concurrent 패키지에 Future라는 클래스가 있다. 한 스레드에서 non-blocking방식으로 메서드롤 수행할 때 그 결과값을 받아올 수 있는 방식을 정의한다. 실습하며 자세히 이해해보자.

     

     

    Non-blocking으로 실행

    main스레드에서 먼저 start를 찍고 새 스레드1을 이용해 new Thread를 찍도록 작업한다. 이후 다시 main스레드에서 end를 찍으며 작업을 마무리하는데 결과를 확인하면 end가 new Thread보다 먼저 찍혀 non-blocking으로 작업이 수행되었음을 확인할 수 있다.

     

    Future를 이용해 결과 받아오기

    이번엔 submit()함수를 사용해 반환값을 지정할 수 있는 Callable을 람다로 넘겨 Future객체를 리턴받았다. (Callable은 Supplier와 같이 반환형만 있는 concurrent패키지의 펑셔널인터페이스다) 놀라운 건 서로 다른 스레드인데 그 값을 get()으로 받아오는 상황인데 당연히 get()을 하는 시점에 메인스레드는 블락상태가 된다. 

     

    FutureTask

    Future안에 callable을 포함한 객체 FutureTask를 이용해서 좀더 깔끔하게 위와 같이 구현할 수 있다. 다만, 역시 get()을 호출하는 시점에 메인스레드는 블락된다.

     

    FutureTask는 내부적으로 작업을 끝내고 done()을 호출하는 구조다. done() 구현은 빈구현으로 되어 있으며 위코드처럼 오버라이딩한 경우 기능을 수행할 수 있다. 결과는 메인의 작업과 새스레드의 작업이 완전히 non-blocking방식으로 구현된 걸 확인할 수 있다.

     

    Custom FutureTask

    get()을 성공한 경우 그 값을 받아 수행할 콜백 successCallback, 실패한 경우 수행할 콜백 errorCallback을 인스턴스 생성시점에 전달받는다. 이후 작업을 마치면 done()이 호출되고 그 결과에 맞게 콜백을 수행하는 구조를 만들었다.

    훨씬 깔끔한 형태로 코드를 작성했고 결과 또한 원하는 대로 처리되었음을 확인할 수 있다!

    'java' 카테고리의 다른 글

    [mac] java 터미널 버전 변경하기  (0) 2022.03.27
    [java] 슈퍼타입토큰(super type token)  (0) 2022.01.01
    Generics와 wildcard  (0) 2021.06.01
    Stream 정리 및 예제  (0) 2021.05.29
    Optional 정리  (0) 2021.05.28

    댓글

Designed by Tistory.