티스토리 뷰

프로그래밍/JAVA

JAVA sleep 에 대해

rlawlstjd007 2016. 11. 16. 14:01
sleep()
 스레드들이 공평하게 순번을 할당받게 하는 가장 좋은 방법 가운데 하나는 주기적으로 대기 상태에 집어넣어주는 것입니다. 대기 상태에 

넣어주고 싶다면 정적 메소드인 sleep() 메소드를 호출하면 됩니다. 이 때 대기 시간을 밀리초 (1 / 1000) 초 단위로 지정하기 위한 숫자를 

인자로 전달해야 합니다. 아래와 같이 말이죠.



1
Thread.sleep(2000);





 이렇게 하면 스레드가 메소드에서 InterruptedException 이라는 확인 예외를 던질 수 있기 때문에 sleep을 호출할 때는 항상 try/catch 블록 안에서 호출해야 합니다. 따라서 아래와 같이 쓸수 있습니다.




1
2
3
4
5
6
7
8
9
try{
 
    Thread.sleep(2000);
 
catch (InterruptedException ex){
 
    ex.printStackTrace();
 
}





 이렇게 하고 나면 지정된 시간이 지나가기 전에는 스레드가 다시 실행되지 않는다는 것을 알 수 있지만 '타이머'가 끝나고 나서도 얼마 정도 시간이 지난 다음에 깨어날 가능성은 어떨까요? 그럴 수도 있고 그렇지 않을 수도 있습니다. 사실 그렇게 중요하진 않습니다. 스레드가 대기 상태에서 깨어나더라도 언제나 실행 가능한 상태로 되돌아게게 되니까요.


  스레드가 지정된 시간이 지나면 자동으로 잠에서 깨어나서 현재   실행중인 상태가 되는 것은 아닙니다. 스레드의 대기 상태가 풀리면 그 스레드의 운명은 다시 스레드 스케줄러의 손에 맡겨지게 됩니다.




 그래서 이전에 봤던 ThreadTester 클래스에서 main 스레드의 "back in the main" 이 "top of the stack 보다 먼저 실행 되도록 하려고 할 때 어떻게 sleep 을 사용하면 될까요? 다음과 같이 진행하면 됩니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class testRunnable /*implements Runnable*/{              
    public void run(){                            
        go();                                           
    }                                                    
    public void go(){
        try{
            Thread.sleep(2000);
        }catch(InterruptedException ex){
            ex.printStackTrace();
        }
        do();
    }
    public void doExcute(){
        System.out.println("top of the stack");
    }
}
 
public class ThreadTester{
    public static void main(String[] args){
        Runnable threadJob = new testRunnable();        // 이렇게 하면 스레드에 새로운 스택 맨 아래에 집어넣을 메소드를 알려줄 수 있습니다.
        Thread myThread = new Thread(threadJob);
         
        myThread.start();
    
        System.out.println("back in main");
    }
}
 
cs


        


출처 : headfirst JAVA

반응형
댓글