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을 실행하던 코루틴이 재개될 수 있다.
'Programming > Languages (Java, etc)' 카테고리의 다른 글
코루틴 Thread confinement 기법 (0) | 2024.10.28 |
---|---|
[Kotlin, Jackson] @JsonCreator 로 enum 값 유연하게 역직렬화 (0) | 2024.08.09 |
[Kotlin] runBlocking vs coroutineScope (0) | 2024.08.02 |
[Java] JDK 21 Virtual Threads 톺아보기 (1) | 2024.01.04 |
[JPA] JPA와 @Transactional (2) | 2023.12.03 |
댓글