작성
·
107
0
main 스레드에서 future.get()을 호출하면 결과값이 올때까지 다음 코드라인을 실행할 수 없는 상태가 된다고 보면 될까요?
앞서 스레드들은 락 대기 집합, 스레드 대기 집합 같은 곳에서 대기를 했는데요 future.get()을 한다면 main 스레드도 대기를 할곳이 필요해 보이는데 저런 대기 집합 장소가 따로 있는지 궁금합니다.
블로킹에 대한 개념을 보면서 동기/비동기, 블로킹/논블로킹에 대한 차이점에 대해 궁금해졌습니다. 구글링을 하면서 자료 조사를 했는데 여전히 헷갈리네요 혹시 간단하게 이 개념들의 차이점에 대해 설명해주실 수 있을까요
답변 1
1
안녕하세요. 감바스님
future.get()
호출 시 블로킹 여부네, 맞습니다. future.get()
을 호출하면 해당 Future
객체가 반환할 결과값을 기다릴 때까지 현재 실행 중인 스레드(즉, main
스레드)는 블로킹 상태가 됩니다. future.get()
을 호출한 시점에서 결과값이 즉시 반환되지 않으면 결과가 반환될 때까지 main
스레드는 대기하고, 그 이후에 다음 코드 라인이 실행됩니다. 따라서, future.get()
은 블로킹 메소드입니다.
future.get()
대기 여부future.get()
을 호출한 스레드는 WAITING 상태로 전환됩니다. 이러한 대기 상태는 강의 초반에 설명드린 것 처럼 JVM과 운영체제의 스케줄러가 관리하며, 결과가 준비되면 다시 실행 가능한 상태로 전환됩니다.
다음 링크를 참고해주세요.
감사합니다.