• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

안녕하세요. 질문이 있습니다.

21.12.13 17:43 작성 조회수 138

1

이전 강의때도 궁금했던 거였는데 메인함수 마지막에 Thread.sleep()은 어떤 이유에서 필요한 건지 궁금합니다.

알려주실 수 있을까요...?

 

감사합니다.

답변 1

답변을 작성해보세요.

0

안녕하세요. 제가 강의에서 Thread.sleep( )에 대해서 설명을 했었을거라고 생각했는데 아마 설명을 빠뜨렸나 보네요.

간단하게 설명을 드리자면, 저희 강의 예제는 하나의 쓰레드에서 실행이 될 경우에는 모두 main 쓰레드에서 실행이 되는데 이 경우에는 단일 쓰레드에서 실행이 되기 때문에 Thread.sleep()을 붙일 필요가 없구요. 하나 이상의 쓰레드에서 실행이 되는 경우에만  Thread.sleep() 을 main 메서드 마지막에 추가합니다. 이유는 쓰레드의 특성상 main 쓰레드와 편의상 A라는 다른 쓰레드가 동시에 실행이 될 경우 A 쓰레드의 실행이 끝나기도 전에 main 쓰레드가 종료되기 때문인데요. 원활한 강의 진행을 위해서 Thread.sleep()을 이용하여 A라는 쓰레드의 실행이 끝나기전에 main 쓰레드가 종료되지 않고 딜레이 되도록 해줍니다.

아래 코드를 보시면,

public static void main(String[] args){
Logger.log("# start : " +TimeUtil.getCurrentTimeFormatted());

Observable.interval(1000L, TimeUnit.MILLISECONDS)
.map(num -> num + " count")
.subscribe(data -> Logger.log(LogType.ON_NEXT, data));

TimeUtil.sleep(3000);
}

위 예제 코드에서 TimeUtils.sleep(3000) 코드를 주석처리하고 실행 시키면 Observable.interval.. 코드가 실행이 되지 않습니다. 이유는 interval 연산자는 내부적으로 main 쓰레드가 아닌 Computation 쓰레드에서 실행이 되기 때문에 Observable.interval.. 코드가 실행이 되기도 전에 main 쓰레드가 종료되기 때문입니다.

위 코드의 실행 결과는 아래와 같은데요.

# start : 21:32:00.076 | main | 21:32:00.080

onNext() | RxComputationThreadPool-1 | 21:32:01.271 | 0 count

onNext() | RxComputationThreadPool-1 | 21:32:02.269 | 1 count

onNext() | RxComputationThreadPool-1 | 21:32:03.269 | 2 count

: 실행 결과를 보시면 "# start... " 문자열은 main 쓰레드에서 실행이 되지만 Observable.interval... 코드는 RxComputationThreadPool이라는 쓰레드에서 실행이 되는것을 볼 수 있습니다.

 

이해가 충분히 되셨나 모르겠네요. 다른 궁금한점이 있으시면 언제든지 편하게 질문주세요.

감사합니다.

Mimorinn님의 프로필

Mimorinn

질문자

2021.12.14

충분히 이해되었습니다.ㅎㅎ

 

친절히 설명해주셔서 감사드립니다.