티스토리 뷰

새로 생성된 스레드의 세 가지 상태

1. 새로운 스레드 

1
Thread t = new Thread(r);




 Thread 인스턴스가 만들어지긴 했지만 아직 시작되지 않았습니다. Thread 객체만 있고 아직 실행 스레드는 없는 상황입니다.



2. 실행 가능한 상태


1
t.start()




스레드를 시작하면 실행 가능한 상태로(runnable state)로 들어갑니다. 즉, 실행할 준비가 되어있고 실행 대상으로 선정되기를 기다리고 있는 상태가 되는 것 입니다. 이 시점에서는 이 스레드를 위한 새로운 호출 스택이 있습니다.



3. 실행 중인 상태

1
실행 대상으로 선정되었을 때 





 이 상태가 '현재 실행중인 스레드'가 되는 것입니다. 그런 결정은 JVM 스레드 스케줄러만이 내릴수 있습니다. 때때로 그런 결정에 영향을 끼칠 수는 있지만 실행 가능한 상태의 스레드로 만들수 는 없습니다. 실행중인 상태에서는 그 스레드가 활성 호출 스택을 가지게 되고 그 스택의 맨 위에 있는 메소드가 실행됩니다




 하지만 일단 스레드가 실행 가능한 상태에 들어가고 나면 실행 가능한 상태와 실행중인 상태, 그리고 또 다른 추가적인 상태인 '일시적인 실행 불가능 상태 (' 봉쇄 상태 ' 라고도 부릅니다.) 사이에서 왔다갔다 하게 됩니다.



스레드 스케줄러

 

 누가 실행중인 상태에서 실행 가능한 상태로 움직여야 할지, 언제 스레드가 실행중인 상태를 떠나야 하는지 등의 결정은 모두 스레드 스케줄러가 내립니다. 스케줄러는 어떤 스레드가 실행되어야 하는지 얼마나 오랫 동안 실행되어야 하는지, 그리고 스케줄러에서 그 스레드를 현재 실행중인 상태에서 쫓아냈을 때 그 스레드가 어디로 가야 하는지도 결정합니다. 


 그러나 스케줄러를 사용자 마음대로 제어할 수는 없습니다. API애는 스케줄러에 대해 호출할 수 있는 메소드가 하나도 없기 때문입니다. 즉, 스케줄링과 관련하여 어떤 것도 확언할 수 없다는 것입니다.


 그래서 반드시 지켜야 할 한 가지 규칙은 "스케줄러가 어떤 특별한 방식으로 작동할 것을 가정하고 프로그램을 만들면 안된다." 라는 규칙입니다. 프로그램을 한 대에서만 테스팅 해보고서는 그 프로그램을 어디에서 실행시키든지 스레드 스케줄러가 항상 그런 식으로 작동할 것이라고 생각하는 것은 오산입니다.


 그렇다면 여러 곳에서 테스트 해봤을 때 동일한 결과를 출력하는 멀티 스레딩 프로그램을 만들려면 어떻게 해야 할까요?


 스레드 스케줄러에 가장 큰 영향을 미치는 것 가운데 하나는 바로 대기 상태 입니다. 어떤 스레드를 대기 상태에 집어넣으면, 그 시간이 몇 밀리초 밖에 안더라도 그 실행중인 상태의 스레드가 실행중인 상태에서 벗어나고 다른 스레드에 실행 기회를 주게 됩니다. 


 스레드의 sleep() 메소드에서는 한 가지 보장해주는 것이 있습니다. 대기중인 스레드는 대기 시간이 종료되기 전까지는 절대 현재 실행중인 스레드가 되지 않는다는 것 입니다. 예를 들어, 어떤 스레드를 2초 동안 대기시켰다면 그 스레드는 그 2차가 지나가기 전에는 절대 실행중인 상태의 스레드가 되지 않습니다.


 

스케줄러의 불확실성



  이전에 ThreadTester 클래스를 실행 시켰을 때 다음과 같은 결과가 나왔습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ java ThreadTester
back in main 
top of the stack
 
$ java ThreadTester
back in main 
top of the stack
 
$ java ThreadTester
top of the stack
back in main 
 
$ java ThreadTester
back in main 
top of the stack
 
$ java ThreadTester
top of the stack
back in main 
 



 

 위의 결과를 보게 되면 순서가 아무렇게나 바뀐다는 것을 알 수 있습니다. 새로운 스레드가 먼저 끝나기도 하고 메인 스레드가 먼저 끝나는 경우도 있습니다. 


출처 : headfirst JAVA

반응형

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA mp3 파일 정보 알아내기  (2) 2016.11.24
JAVA sleep 에 대해  (0) 2016.11.16
JAVA Thread 사용법  (0) 2016.11.16
JAVA Thread에 대해  (0) 2016.11.15
JAVA 엑셀 파일 불러오기  (1) 2016.11.05
댓글