반응형

sleep()

  • 현재 쓰레드를 지정된 시간동안 멈추게 한다.

sleep() 메서드는 현재 쓰레드를 지정된 시간동안 멈추게 한다.
sleep()은 static메서드라서 항상 현재 쓰레드에 대해서 동작한다.

Thread 실행제어 메서드들 중에 static 메서드는 2개 있다고 했었다.
1. sleep()
2. yield() 양보
이 두 메서드는 static 메서드 이기 때문에 자기 자신에게만 동작한다.

 

  • 예외처리를 해야한다. (InterruptedException이 발생하면 깨어남)

sleep()은 예외를 발생시킬 수 있는 메서드라서 꼭 예외처리를 해줘야 한다.

sleep 상태의 쓰레드가 잠자는 것을 멈추게 되는 것은 2가지 경우가 있다.
1. time-up (시간종료)
2. interrupted (누군가 깨우는 것)

만약에 지정된 시간동안 잠자기 위해 자고있는데, 누군가 해당 쓰레드를 깨우면,
throw new InterruptedException() 예외를 던진다.
그래서 예외가 발생해서 잠자고 있는 상태에서 벗어나게 된다.

그래서 catch블럭에는 아무것도 넣지 않아도 된다.

어쨋든, 이렇게 항상 예외처리를 해줘야 하는데, 이것이 귀찮을 수도 있다.
그래서 메서드를 따로 만들어서 사용한다. 예를 들어 delay라는 메서드를 새로 만들면 아래와 같다.

sleep()메서드를 호출하는 부분은 다른 메서드 안에 넣어버린 것이다.

그러면 최초 코드를, 이렇게 바꿀 수 있을 것이다.

dealy(15); 이런식으로 사용하면, 매번 예외처리 해줄 필요없이  delay 라는 메서드에 sleep메서드와 예외처리를 지정해놓고 사용하는 방식으로 하면 편리하다.

 

  • 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.

이 코드를 보면, th1을 sleep() 하는 것처럼 보이지만, 실제로는 현재 이 코드를 실행하는 쓰레드가 자는 것이다.
그래서 좌측처럼 코드를 쓰면, 에러는 발생하지 않지만, th1을 sleep()시키는 것처럼 오해할 수 있기 때문에,
그리고 static메서드 이므로 우측 처럼 클래스명을 써서 slee()메서드를 사용해야 한다.

 

[Ex13_8]

 


 

interrupt()

  • 대기상태(WAITING)인 쓰레드를 실행대기 상태(RUNNABLE)로 만든다.

 

interrupt() 메서드는 대기상태(WATING)인 쓰레드를 실행대기상태(RUNNABLE)로 만들어준다.
대기상태는, 쓰레드 작업이 중단된 상태를 의미한다. (ex. sleep(), join(), wait())

그럴 때, interrupt()를 호출하면, 중단되어있던 쓰레드를 깨운다.
즉, 중단되어 있던 쓰레드를 실행 가능한 상태로 만든다는 것이다.
그것이 바로 Inturrupt() 메서드이다.

interrupt() 관련 메서드로는

  • isInterrupted()
  • interrupted() 

2개가 있다.
둘의 차이는,
isInterrupted()는 쓰레드가 인터럽트 되었는지를 알려주는 것이고,
interrupted()static메서드로, 현재 쓰레드의 상태를 알려주고, false로 초기화 한다는 차이점이 있다.

 

코드를 보면,
어떤 쓰레드를 만들고 start() 했는데, 돌리다가 th1을 인터럽트했다.
그러면 이 쓰레드의 interrupted 상태가 true가 된다.
그러면 th1에 isInterrupted()를 호출하면, 결과가 ture가 될 것이다.

이것은 Thread 클래스의 코드를 이해하기 쉽게 변경한 것인데,
이 쓰레드 클래스 안에 쓰레드가 인터럽트 되었는지 안되었는지
상태를 저장하는 변수 boolean interrupted = false가 있는 것이다.

그래서 interrupt가 호출되면 이 값이 ture로 바뀌는 것이다.

그래서 isInterrupted()를 호출하면 interrupted 값을 반환하는 것 뿐이다.

그런데, static 메서드인 interrupted는 인터럽트 상태를 알려줌과 동시에 이 변수 값을 false로 초기화 한다.

그래서 이것을 언제 쓰냐면,

우리가 파일을 다운로드 받을 때,
진행상태를 보여주는데, 취소 버튼이 있을 것이다.
이 취소 버튼을 누르면 인터럽트가 호출 되도록 하는 것이다.

그러면 이 쓰레드가 다운로드를 수행하다가 isInterrupted()가 호출되면,
!true -> false가 되어 이 반복문을 빠져나가게 된다.
이 반복문은 다운로드를 정상적으로 다 끝내던가,
취소 버튼을 눌렀을 때 다운로드를 중단하도록 코드가 작성되어 있는 것이다.

[Ex13_9]

반응형