반응형
개요
- 김영한 강사님의 강의를 듣고 정리하였다.
스레드의 작업이 바쁘지 않은 경우 다른 스레드에게 CPU를 양보하는 것이 효율적일 것이다.
어떻게 하면될까?
본론
스레드가 CPU를 할당받아 실행하는 것은 운영체제의 스케줄러가 담당한다.
하지만 스레드의 작업이 그렇게 바쁘지 않은 경우 다른 스레드가 작업을 하는 것이 효율적일 것이다.
어떤 방법을 사용할 수 있을까?
1. Thread.sleep(1)
- Thread.sleep() 메서드를 사용해서 스레드가 TIMED_WAITING 상태로 전환되면서 CPU를 사용하지 않도록 한다. 이후 TIMED_WAITING 상태가 RUNNABLE로 돌아오면서 다시 실행 스케줄러에 포함된다.
- 결과적으로보면 TIMED_WAITING 상태가 되면서 다른 스레드들이 CPU를 사용할 수 있도록 한다.
하지만 이 방식은 복잡한 방식을 사용하고, 특정 시간만큼 스레드가 실행되지 않는다.
즉, 양보할 스레드가 없는 경우 양보할 필요가 없더라도 양보하게 되는 문제가 있다.
2. yield()
자바의 스레드들은 RUNNABLE 상태에서 실제로는 2가지 상태를 가진다.
- 스레드가 실제로 CPU를 할당받아 실행중인 상태
- 스레드가 CPU를 할당받지 못하고 스케줄러에서 대기중인 상태
yield()의 작동 방식
Thread.yield() 메서드는 현재 실행중인 스레드가 CPU를 양보할 수 있도록 운영체제에게 힌트를 제공한다.
따라서 RUNNABLE 상태를 유지하면서 다른 스레드들이 CPU를 사용할 수 있도록 다시 스케줄러로 돌아간다.
- 물론 운영체제에게 힌트만 제공할 뿐 강제적인 실행 순서를 지정하지 않는다.
따라서 sleep()의 단점인 상태가 변경되지도 않고, 양보할 스레드가 없다면 자신이 실행한다는 특징이 있다.
결론
스레드의 작업을 양보할 수 있는 Thread.yield()를 알아보았다.
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 자바의 임계 영역과 동기화, synchronized (0) | 2024.09.23 |
---|---|
[JAVA] 자바의 volatile 키워드와 메모리 가시성 (1) | 2024.09.23 |
[JAVA] 대기중인 스레드를 RUNNABLE로 깨우려면 어떻게 해야할까? (0) | 2024.09.21 |
[JAVA] 스레드의 상태 (getState()) (3) | 2024.09.02 |
[JAVA] 자바에서 스레드를 만들고 사용하는 방법 (1) | 2024.08.30 |