CS 이론

Thread 실행제어와 상태

potatoo 2022. 11. 7. 14:13
728x90

Thread의 상태는 6가지(NEW, RUNNABLE, BLOCKED, WAITING, TIME_WATING, TERMINATED)로 나뉘어진다.

그 중에서 중요하게 봐야할 상태는 WAITING, BLOCKED, RUNNABLE 상태이다.

 

이 3가지 상태를 제어하는 Thread상태 제어 메서드는

위의 표에 적힌 메서드들이 있다.

 

가장 먼저 sleep() 메서드를 먼저 살펴보면, sleep은 현재 진행중인 쓰레드를 일정시간동안 정지시키는 메서드이다.

이 메서드는 interrupt()메서드와 떨어질 수 없는 관계이기 때문에 interrupt()메서드가 호출 될 경우를 필수예외로 처리해야 한다.

sleep()메서드를 사용하면서 중요하게 생각할 것은 sleep()메서드는 static메서드라는 것입니다.

static메서드이기 때문에 현재의 쓰레드 외에 특정 쓰레드를 지정하여 메소드를 호출 할 수 없습니다.

 

 

그럼 이제 sleep()과 뗄 수 없는 메서드인 interrupt메서드를 정리 해보겠습니다.

interrupted상태와 관련된 메서드는 3가지가 있습니다.

위에서 얘기 했던 interrupt()는 Thread의 interrupted상태를 true로 변경해주는 메서드입니다.

그리고 boolean타입의 isInterrupted()는 Thread의 interrupted상태를 확인하고 반환합니다.

다음으로 isinterrupted()와 비슷한 메서드인 interrupted()는 현재 Thread의 interrupted상태를 반환하고, false로 초기화합니다.

 

 

sleep()은 RUNNABLE상태에서 WAITING상태로 만들고, interrupt()는 WAITING상태를 RUNNABLE상태로 만들어 줍니다.

 

 

다음으로 join은 지정된 시간동안 특정 쓰레드가 작업하는 것을 기다린다. 즉, sleep()과는 다르게 특정 쓰레드를 지정할 수 있다는 것입니다.

join을 사용하는 이유를 간단한 예, 메인 쓰레드에서 다른 쓰레드들을 실행했다고 했을 때 메인 쓰레드에서 이 쓰레드들의 결과를 출력하려고 한다. 이 상황에서 join을 사용하지 않으면 어떻게 될지 생각해보면 간단합니다.

실행결과는 메인 쓰레드가 다른 쓰레드들의 결과 값을 못받거나 중간값만을 받고 먼저 종료될 것입니다.

그렇기 때문에 다른 쓰레드들이 끝날때까지 기다렸다가 결과를 출력하고 끝나는 것입니다.

sleep과 마찬가지로 join 또한 InterruptedException을 처리해줘야합니다.

 

stop,suspend,resume은 deprecated처리 되었음으로 사용하지 않는게 좋다.

 

마지막으로 yield()는 자신(현재 Thread)은 실행대기 상태로 돌아가고 다음 Thread에게 넘기는 것이다.

 

728x90