개발 등/고급

[Thread] sleep() 와 interrupt()에 대해

darkhorizon 2008. 10. 16. 11:17
728x90
반응형

  sleep(long millis) 메서드는 인자값인 millis초가 동안 대기상태(NotRunnable status)에 있다가, 그 시간이 지나면 자동적으로 다시 준비상태(Runnable status)로 돌아오는 메서드이다,
그런데 sleep의 시간이 종료되기 전에 강제로 깨워서 준비상태로 되돌리는 메서드가 있는데, 그것이 바로 interrupt()메서드이다,
sleep 상태에 있던 스레드가 interrupt로 호출되었을 때, InterruptedException이 발생한다.
그런데..
대기상태가 아닌 준비상태에 있던 스레드를 interrupt 로 호출했을 경우, interrupt가 해당 스레드에 미치는 영향은 무엇일까?


public class InterruptTest{
   static Master master;
   static Servant servant;
   InterruptTest(){
       servant=new Servant();
       master=new Master();
        System.out.println("메인스레드 종료");
   }
   public static void main(String[] args){
       InterruptTest it=new InterruptTest();
// master 스레드가 먼저 실행되도록 우선순위를 높게한다.
// setPriority(int priority)의  변수가 클수록 우선순위가 높음.
       master.setPriority(10);                 
       servant.setPriority(1);
       master.start();   servant.start();
   }
}

class Master extends Thread{
    public void run(){
// 대기상태가 아닌 준비상태에 있는 servant 스레드를 깨운다.
       InterruptTest.servant.interrupt();
       System.out.println("어서 일어나지 못할까!!!!");
       System.out.println("Master 스레드 종료");
.// master 스레드가 종료된다.
    }
}

class Servant extends Thread{
    public void run(){
       for(int i=0; i<3;i++){
           for(int r=0;r<30;r++){
// 1부터 30번까지 출력한 다음 대기상태에 들어간다.
               System.out.print(r+" ");
           }
          System.out.println();
          try{
// 1초를 대기 상태에 있은 다음 2번 더 위의 작업을 반복한다.
              System.out.println("자야겠군..");
              Thread.sleep(1000);
          }catch(InterruptedException ie){
              System.out.println("이런 젠장.!!!!!");
          }
       }
    }
}

결과 :

메인 스레드 종료
어서 일어나지 못할까!!!!
Master 스레드 종료
0,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,29,
자야겠군..
이런 젠장.!!!!!
0,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,29,
자야겠군..
0,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,29,
자야겠군..

이미 master 스레드는 종료된 후 servant 스레드가 구동이 되어 run()를 수행하게 된다.
그런데 한 번 작업을 수행한 뒤 sleep() 상태에 들어가게 되는데, 대기시간이 지나기도 전에 InterruptedException이 발생하게 된다.
이 말은 즉 누군가가 sleep() 상태에 있는 servant 스레드를 interrupt했다는 의미다,
그렇다면 도대체 누가 잠자고 있던 servant를 깨웠을까?
Main 스레드와 master 스레드는 이미 종료되었는데...
해당 스레드에 interrupt()를 호출한다고 해서, 직접 그 스레드에 영향을 미치는 건 아닌 것 같다.
스레드를 관리하는 JVM에는 interrupt status라는 내부변수가 있는데,  inerrupt()를 호출하게 되면  JVM이 해당 스레드에  대한  interrupt status 변수의 값을 가지고 있다가, sleep()에 들어가게 되면 그 시점에서 영향을 미치는 것으로 짐작된다.

728x90