본문 바로가기
Programming/Languages (Java, etc)

코루틴 스코프에서 스레드 블로킹 해보기

by kghworks 2024. 12. 26.

Replace this "Thread.sleep()" call with "delay()".

 

 suspend 함수에서 스레드 블로킹 함수를 호출하면 Replace this "Thread.sleep()" call with "delay()". 과 같은 경고 메시지가 출력된다.  코루틴은 suspend라는 개념을 지원해서 스레드를 블로킹하지 않고 스레드가 다른 코루틴을 실행할 수 있도록 하여 전체 처리량 (throughput)을 높일 수 있다.


 따라서 suspend 블록에서 스레드를 블로킹하는 행위나 메서드 호출은 지양하는 것이 좋다. 코루틴 스코프에서 스레드를 블로킹했을 때 동작을 육안으로 확인해 보고자 코드를 작성해 봤다.

코드

  • singleThreadContext : 싱글 스레드 코루틴 context로 제한. 멀티 스레드 컨텍스트면 하나의 스레드를 블로킹해도 다른 스레드가 있기에 블로킹 결과를 육안으로 보기 힘듦
  • job1 : 50ms마다 문장을 출력하는 간단한 잡
  • job2 : 1000ms동안 스레드를 블로킹하는 잡

실행결과 (스레드 블로킹)

 

 job2가 실행되는 순간 스레드를 블로킹하므로 job1을 실행하던 코루틴이 불가능해졌다.  코루틴을 스레드 블로킹 없이 지연하는 함수 delay를 사용하면 job2가 중지(suspend)되는 순간 job1을 실행하던 코루틴이 재개될 수 있다. 

실행결과 (코루틴 중지)

댓글