Day 62

ChangWoo·2023년 6월 6일
0

자바의 정석

목록 보기
59/71
post-thumbnail

ch 13-18~21 데몬 쓰레드, 쓰레드의 상태

데몬 쓰레드(daemon thread)

  • 일반 쓰레드(non-daemon thread)의 작업을 돕는 보조적인 역할을 수행
  • 일반 쓰레드가 모두 종료되면 자동적으로 종료된다.
  • 가비지 컬렉터, 자동저장, 화면 자동갱신 등에 사용된다.
  • 무한루프와 조건문을 이용해서 실행 후 대기하다가 특정조건이 만족되면 작업을 수행하고 다시 대기하도록 작성한다.

  • setDaemon(boolean on)은 반드시 start()를 호출하기 전에 실행되어야 한다. 그렇지 않으면 illegalThreadStateException이 발생한다.

쓰레드의 상태


  • 실행중 또는 실행대기 상태 모두 RUNNABLE이다.
  • 생성 -> 실행대기 -> 실행 -> 실행대기 -> 실행 반복 -> stop()메서드가 호출되면 소멸된다.
  • 일시정지 = WAITING, BLOCKING
  • suspend() = 일시정지 / sleep() = 잠자기 / wait() / join() = 기다리기 / I/O block = 입출력 대기
  • time-out = 시간 종료 / reaume() = 일시정지 상태(suspend) 풀기 / notify = 일시정지 상태(wait) 풀기 / interrupt() = 잠자기(sleep)를 깨운다.

쓰레드의 실행제어

  • 쓰레드의 실행을 제어할 수 있는 메서드가 제공된다.
  • sleep() : 지정된 시간동안 쓰레드 일시정지 / 지정시간 끝나면 다시 실행대기상태
  • join() : 다른 쓰레드 기다리기
  • interrupt() : sleep() 또는 join() 상태에서 깨우는 것
  • stop() : 쓰레드 종료
  • suspend() : 쓰레드 일시정지
  • resume() : 일시정지 재개
  • yield() : 다른 쓰레드에게 주어진 시간을 양보
  • sleep()과 yield()만 static메서드가 붙고 이 둘은 쓰레드 자기 자신에게만 호출 가능하다.
  • 다른 실행제어 메서드는 다른 쓰레드에게 호출 가능하다.

ch 13-22~25 sleep(), interrupt()

sleep()

  • 현재 쓰레드를 지정된 시간동안 멈추게 한다.
static void sleep(long millis)            // 천분의 일초 단위
static void sleep(long millis, int nanos) // 천분의 일초 + 나노초
  • 예외처리를 해야한다.(InterruptedException이 발생하면 깨어남)
try {
	Thread.sleep(1, 500000);  // 쓰레드를 0.015초 동안 멈추게 한다.
} catch(InterruptedException e) {} // InterruptedException은 Exception의 자손. 필수 예외처리
  • sleep 상태의 쓰레드는 time-up(시간종료) 또는 interrupted(깨우기)로 깨워야 한다.
void delay(long millis) {
	try {
    	Thread.sleep(millis);
    } catch(InterruptedException e) {}
}
  • 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능하다.
try {										try {
	th1.sleep(2000);				 -> 		Thread.sleep(2000);
} catch(InterruptedException e) {}			} cathc(InterruptedException e) {}
  • thread1을 sleep시키는 것이 아닌데 오해(에러는 안나는)를 할 수 있으므로 오른쪽과 같이 클래스이름을 써줘야 한다.

interrupt()

  • 대기상태(WAITING)인 쓰레드를 실행대기 상태(RUNNABLE)로 만든다.
void 	 interrupt()			쓰레드의 interrupted상태를 false에서 true로 변경.
boolean  isInterrupted()		쓰레드의 interrupted상태를 반환.
static boolean interrupted()    현재 쓰레드의 interrupted상태를 알려주고, false로 초기화


  • Thread 클래스 안에 interrupted상태를 알려주는 변수를 생성하고 interrupted가 되면 false값이 true로 바뀐다.
  • isinterrupted를 호출하면 interrupted의 값을 반환한다.
  • interrupted는 값을 true에서 false로 바꾼다. (그래야 누가 또 interrupt)를 호출했을 때 알 수 있으므로 초기화 해준다.)
  • download가 완전히 끝나거나 취소버튼을 눌렀을 때 download가 종료된다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글